2012-09-13 4 views
6

독일어를 배우는 사람들을위한 Java 응용 프로그램을 만들고 있는데이 언어의 특수 문자에 문제가 있습니다. 나는 JTextField의 하위 클래스를 만들어 모든 ASCII 문자에 대해 평소와 같이 동작하면서 ALT + a를 ä, ALT + o를 ö로 해석하는 등의 작업을 수행합니다.JTextField의 독일어 문자

내 시도 지금까지 :

public class GermanTextField extends JTextField implements KeyListener{ 
    public GermanTextField() { 
    init(); 
    } 

    // other constructors ... 

    private void init() { 
    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent arg0) {} 


    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'o' && evt.isAltGraphDown()){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 


} 

코드 위 (표준 JTextField를 같은 GermanTextField 동작합니다)를 작동하지 않습니다, 나는 콘솔에 evt.getKeyChar()를 인쇄 할 때이 내가 무엇을 얻을 수 있습니다 :

? 
? 
? 
? 

이를 내 시스템에 ALT + o가 생성되므로 내 자신의 언어 때문일 수 있습니다. 물론 그럴 수도 있습니다.

public void keyTyped(KeyEvent evt) { 
    if(evt.getKeyChar() == 'ó'){ 
     setText(getText() + "ö"); 
     evt.consume(); 
    } 
    } 

폴란드어 이외의 다른 시스템에서는 작동하지 않습니다.

내 질문은 : 언어 설정이 다른 시스템에서 예상대로 작동하는이 문제에 대한 해결책이 있습니까? MvGs에 따라이 문제에 대한


전체 솔루션은 답변 :

package daswort.gui; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JTextField; 

public class GermanTextField extends JTextField implements KeyListener{ 

    private Map<Integer, String> transform = 
     new HashMap<Integer, String>(); 

    public GermanTextField() { 
    init(); 
    } 


    public GermanTextField(int columns) { 
    super(columns); 
    init(); 
    } 


    public GermanTextField(String text, int columns) { 
    super(text, columns); 
    init(); 
    } 


    public GermanTextField(String text) { 
    super(text); 
    init(); 
    } 


    private void init() { 
    transform.put(KeyEvent.VK_A, "äÄ"); 
    transform.put(KeyEvent.VK_U, "üÜ"); 
    transform.put(KeyEvent.VK_O, "öÖ"); 

    addKeyListener(this); 
    } 



    public void keyPressed(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     String umlaut = transform.get(evt.getKeyCode()); 
     if(umlaut != null){ 
     int idx = evt.isShiftDown() ? 1 : 0; 
     setText(getText() + umlaut.charAt(idx)); 
     } 
    } 
    } 

    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent evt) { 
    if(evt.isAltGraphDown()){ 
     evt.consume(); 
    } 
    } 


} 
+0

콘크리트 Locale (자신의 Encode Page)에 대한 문자의 배열을 만들려면 Alt-o는 os 또는 키보드의 지역 설정에 따라 달라질 수 있습니다. – Pao

+0

현재 어떤 운영 체제를 사용하고 있습니까? "ALT + o가"를 생성하지만, 대부분의 OS에서는 Alt를 응용 프로그램 바로 가기로 사용할 수 있습니다. 한 가지 주목할만한 예외는 OS X입니다. Alt는 [Alt Gr] (http://en.wikipedia.org/wiki/AltGr_key)의 역할을 수행하므로 대체 문자를 사용할 수 있습니다. – MvG

답변

6

현재 로캘과 관계없는 키 이벤트를 확인하려면 getKeyChar을 사용하지 마십시오. 대신 문자와 연결된 키와 관계없이 키를 식별하려면 isKeyCode()을 사용하십시오. 이처럼 :

if (evt.getKeyCode() == KeyEvent.VK_O && evt.isAltGraphDown()) 

이것은 어떤 키보드 레이아웃에 Alt 키 할머니 + O 일치해야합니다.

+1

evt.getKeyCode()는 keyPressed() 및 keyReleased() 이벤트에서만 의미있는 것을 반환하기 때문에이 방법은 효과가 없습니다 (이전에 살펴 보았습니다) – KCH

+0

약간 다른 방식으로 제안한 것을 사용했습니다 (keyPressed()에 코드 배치, keyTyped()에서 ALT GR 키를 눌러 모든 이벤트 사용). 원하는대로 작동합니다. 감사. – KCH

0

문제는 JTextField를 JTextArea에 아닌 다른 기본 글꼴을 사용한다는 것입니다. 나는 다중 언어를 지원해야만했던 어플리케이션에서 같은 문제를 겪었다.

JTextField는 일반적으로 Courier New와 같이 단락 간격 글꼴을 표시하는 데 사용됩니다. 일반적으로 Java에는 한자를 표시하기 위해 모노 간격의 그래픽 글꼴에 대한 추가 매핑이 없습니다.

"123"이라는 글꼴이 없으므로 기본값이 사용됩니다 (대화 상자). "dialog"글꼴은 플랫폼의 font.properties 파일에있는 글꼴 모음에 내부적으로 매핑됩니다. 이것은 JTextField가 사용하는 글꼴과 같은 글꼴입니다.

모든 그래픽 구성 요소에서 동일한 글꼴 정의가 사용되도록 다음 수정 사항이 있습니다. JTextField의 특정 키를 찾아서 변경할 수도 있습니다. 이 방법으로 구성 요소의 글꼴에 대해 걱정할 필요가 없으며 대화 상자를 사용하여 초기화됩니다. JTextField가 포함 된 클래스 내에 다음 코드를 입력하십시오.

Object fontDefinition = new UIDefaults.ProxyLazyValue("javax.swing.plaf.FontUIResource", null, new Obje 

java.util.Enumeration keys = UIManager.getDefaults().keys(); 
while (keys.hasMoreElements()) { 
    Object key = keys.nextElement(); 
    Object value = UIManager.get(key); 
    if (value instanceof javax.swing.plaf.FontUIResource) { 
     UIManager.put(key, fontDefinition); 
    } 
} 

희망이 있습니다.

+0

코드를 포맷 한 후 첫 번째 줄 끝에 뭔가 빠져있는 것처럼 보입니다. 적절한 수정을 부탁드립니다. –

+0

@ Code-Guru님께 고맙겠습니다.하지만 빠진 것이 없다고 생각합니다. – Ewen

+2

첫 번째 줄을보십시오. 그것은'new Obje '로 끝납니다. 확실하게 뭔가가 빠져 있습니다. –

1

내 시스템에서 ALT + o가 내 언어를 생성하므로 내 언어가 원인 일 수 있습니다.JTextComponents

에 대한

사용 DocumentFilter을하지만 그것은 아마 폴란드어 이외의 시스템에서 작동하지 않습니다 : 물론 나는 그런 식으로 일을 할 수 있었다.

내 질문은 : 언어 설정이 다른 시스템에서 예상대로 작동하는이 문제에 대한 해결책이 있습니까?

  • 모든 PC가 당신이 할 수 있습니다

  • Native OS (잘못된 결정)에 Locale에 대한 전가 올바른 값을 가지고 희망을,이 없습니다에 어떤 Unicode Chars를 썼다 ALTnumbers

  • 가장 안전한 것은 다음을 수행 할 수 있습니다 Locale에 대한 useraction에 의한 설정은 응용 프로그램의 입력은 OS가있는 응용 프로그램이 실행 Alt 키-a 또는를위한 생산에 따라 달라집니다

+1

나는 itemize리스트에있는 문장의 파편이 실제로 무엇을 의미하는지 알아 내기가 힘듭니다. 아직 잘 모르겠지만 편집하지 않을 것입니다. – MvG

관련 문제