2013-05-27 11 views
11

Ich habe ein paar Eingabemethoden zum Schreiben (Traditionelles Chinesisch) Taiwanese, die mit Windows 7 kommen. Auch alle Eingabemethoden haben eine Option, das Zeichen zu wechseln Breite (Einzelbyte/Doppelbytezeichen).Automatische Umschaltung der Zeichenbreite durch Windows 7 Eingabemethoden in Java

  • Chinesisch (traditionell) - Neues Schnell
  • Chinesisch (traditionell) - ChangJie
  • Chinesisch (traditionell) - Schnelles
  • Chinesisch (traditionell) - Phonetik
  • Chinesisch (traditionell) - New Phonetic
  • Chinesisch (traditionell) - Neue ChangJie

Wenn ich einen wählen dieser Eingabemethoden in Java-Anwendung und setzen Sie die Zeichenbreite auf halbe Breite (Single-Byte-Zeichenmodus) kann ich erfolgreich Text in JTextField eingeben. Wenn die Anwendung jedoch ein Dialogfeld (z. B. JOptionPane) oder ein Popup-Fenster anzeigt, ändert sich die Zeichenbreite der Eingabemethode automatisch in die volle Breite (Doppelbyte-Zeichenmodus). Danach muss der Benutzer manuell auf Zeichen mit halber Breite umschalten.

Ich kann programmgesteuert die Eingabemethode mit der Java-Klasse "InputContext" ein- oder ausschalten, aber ich kann nicht steuern, ob die Eingabemethode auf Zeichenmodus mit voller Breite/halber Breite (Single/Double Byte) eingestellt ist .

Ich dachte, vielleicht könnte es von den Windows-Eingabemethode Einstellungen deaktiviert werden, aber es gab keine Option im Zusammenhang mit der automatischen Umschaltung der Zeichenbreite.

Die Frage ist: Gibt es eine Möglichkeit, dieses automatische Umschalten zu behandeln (deaktivieren)?

Hier ist ein Beispielcode dies mit den oben genannten Eingabemethoden zu testen:

public class Example implements ActionListener { 

    JFrame f = new JFrame("pasod"); 
    JTextField txt = new JTextField(); 
    Button btn = new Button("Locale"); 

    public Example() { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout()); 
     btn.addActionListener(this); 
     panel.add(btn); 
     panel.add(txt); 
     f.add(panel); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setSize(800, 100); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Example();    
    } 

    public void actionPerformed(ActionEvent arg0) { 
     JOptionPane.showMessageDialog(btn, "Neso", "Neso", 
       JOptionPane.INFORMATION_MESSAGE); 
    } 
} 

Dank.

+0

Nur ein Nitpick, aber ich glaube nicht, dass die [volle/halbe Breite Formen] (http://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms) etwas mit der Anzahl der Bytes zu tun haben, die sie in UTF konsumieren -16. Nicht, dass das mit dem Problem hilft. +1 – McDowell

+1

Es gibt viele Dinge, die Menschen finden, dass die JOptionPane falsch macht und die einzige einfache Lösung ist es, Ihre eigenen zu machen. Ich habe meine eigene JDialog-Klasse für Java entwickelt und verwende sie seither. –

Antwort

1

Ok Ich hatte eine Spur durch den Java-Quellcode auf der Suche nach allem, was herausragt;

Sie rufen JOptionPane.showMessageDialog() diese Überlast auf JOptionPane.showOptionDialog();

public static int showOptionDialog(Component parentComponent, 
     Object message, String title, int optionType, int messageType, 
     Icon icon, Object[] options, Object initialValue) 
     throws HeadlessException { 
     JOptionPane    pane = new JOptionPane(message, messageType, 
                 optionType, icon, 
                 options, initialValue); 

     pane.setInitialValue(initialValue); 
     pane.setComponentOrientation(((parentComponent == null) ? 
     getRootFrame() : parentComponent).getComponentOrientation()); 

     int style = styleFromMessageType(messageType); 
     JDialog dialog = pane.createDialog(parentComponent, title, style); 

     pane.selectInitialValue(); 
     dialog.show();  
     //..Result handling code 
    } 

Also schauen wir uns createDialog();

public JDialog createDialog(String title) throws HeadlessException { 
    int style = styleFromMessageType(getMessageType()); 
    JDialog dialog = new JDialog((Dialog) null, title, true); 
    initDialog(dialog, style, null); 
    return dialog; 
} 

So überprüfen wir die Konstruktor/s von JDialog diese alle Anruf dialogInit();

protected void dialogInit() { 
    enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK); 
    setLocale(JComponent.getDefaultLocale()); 
    setRootPane(createRootPane()); 
    setRootPaneCheckingEnabled(true); 
    if (JDialog.isDefaultLookAndFeelDecorated()) { 
     boolean supportsWindowDecorations = 
     UIManager.getLookAndFeel().getSupportsWindowDecorations(); 
     if (supportsWindowDecorations) { 
      setUndecorated(true); 
      getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG); 
     } 
    } 
    sun.awt.SunToolkit.checkAndSetPolicy(this, true); 
} 

Hier haben wir setLocale(JComponent.getDefaultLocale()); gefunden;

So erscheint es immer, wenn Sie einen JDialog erstellen, ob es indirekt ist oder nicht, das Gebietsschema Ihres Programms wird auf den Standard zurückgesetzt, ich nehme an, dies beinhaltet das Zurücksetzen Ihrer Eingabeeinstellungen.

Es gibt einige Möglichkeiten, wie Sie das Standardgebietsschema festlegen können (programmatisch, Systemeigenschaften oder Laufzeitargumente); Details found here

Hoffnung, die Sie

1

hilft ich einen einfachen Test tat:

Ich öffnete IE, ausgewählt, um eine Registerkarte, und bei der Adressleiste chinesischen IME eingestellt halbe Breite zu sein. Klicken Sie dann auf eine andere Registerkarte. Der IME wird automatisch auf die volle Breite geändert.

Also ich glaube nicht, dass es etwas mit Java zu tun hatte. Es ist ein Windows-Verhalten.