2012-09-13 82 views
6

我正在爲學習德語的人員開發Java應用程序,並且遇到了使用該語言的特殊字符的問題。我想創建一個JTextField的子類,它將ALT + a解釋爲ä,ALT + o爲ö等,而對所有ASCII字符的行爲如常。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(); 
    } 
    } 


} 

以上代碼不起作用(GermanTextField行爲就像標準的JTextField),當我打印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

輸入到你的應用程序取決於什麼操作系統上的應用程序運行產生的的Alt-A或Alt-o,這可能取決於OS的區域設置或鍵盤。 – Pao

+0

你在操作什麼操作系統?您爲您編寫「ALT + o會產生ó」,但在大多數我知道的操作系統上,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鍵的Gr + Ø

+1

evt.getKeyCode()僅在keyPressed()和keyReleased()事件中返回有意義的內容,因此此方法不起作用(我之前已檢查過) – KCH

+0

我以略微不同的方式使用了你的建議(將你的代碼放在keyPressed()中,並在keyTyped()中按ALT GR來消費所有的事件),它的工作方式和我想要的一樣。謝謝。 – KCH

0

的問題是,JTextField的使用比JTextArea的不同的默認字體。在我寫的支持多種語言的應用程序中,我遇到了同樣的問題。

您的問題的原因是,JTextField通常用於顯示單間隔字體,如Courier New。通常Java不包含用於顯示漢字的單間隔圖形字體的其他映射。

由於沒有名爲「123」的字體,因此默認設置爲(對話框)。 「對話」字體內部映射到平臺的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

看看第一行。它以'新的Obje'結尾。那裏肯定缺少一些東西。 (您可能需要將代碼向右滾動以查看此內容。) –

1

這可能是由於我自己的語言,因爲ALT + o在我的系統上產生ó。當然,我可以做它像:

使用DocumentFilterJTextComponents

但它可能不會在除拋光之外的任何系統上運行。

我的問題是:有沒有解決這個問題的方法,在具有不同語言設置的系統上會按預期行事?

  • 沒有有沒有,

  • 希望自己的所有PC都在Native OS(錯誤的決定)得到正確的估算值Locale

  • 你可以寫任何Unicode Chars通過使用​​和numbers

  • 最開心的只是通過對Locale useraction設置,那麼你可以創建字符的混凝土Locale(自己Encode Page)數組

+1

我很難搞清楚分項列表中的句子片段實際上是什麼意思。不會編輯它們,因爲我還不確定。 – MvG