2013-05-27 14 views
11

Ho un paio di metodi di input per la scrittura (cinese tradizionale) taiwanese forniti con Windows 7. Inoltre, tutti i metodi di input hanno un'opzione per cambiare il carattere larghezza (caratteri a byte singolo/doppio byte).Cambio automatico della larghezza dei caratteri con i metodi di input di Windows 7 in Java

  • Cinese (tradizionale) - Nuova rapida
  • Cinese (tradizionale) - ChangJie
  • Cinese (tradizionale) - Quick
  • Cinese (tradizionale) - Phonetic
  • Cinese (tradizionale) - New Phonetic
  • Cinese (tradizionale) - Nuova ChangJie

Se seleziono uno di questi metodi di input nell'applicazione Java e impostare la larghezza del carattere a metà larghezza (modalità carattere a byte singolo) posso inserire correttamente il testo in JTextField. Tuttavia, se l'applicazione visualizza una finestra di dialogo (ad esempio JOptionPane) o una finestra pop-up, la larghezza del carattere del metodo di immissione cambierà automaticamente in full-width (modalità caratteri a doppio byte). Successivamente, l'utente deve passare manualmente a caratteri a mezza larghezza.

Posso attivare o disattivare a livello di codice il metodo di input utilizzando la classe Java "InputContext", ma non riesco a controllare se il metodo di input è impostato sulla modalità carattere a larghezza intera/mezza larghezza (singolo/doppio byte) .

Ho pensato che potrebbe essere disattivato dalle impostazioni del metodo di input di Windows, ma non c'era alcuna opzione relativa al passaggio automatico della larghezza del carattere.

La domanda è: C'è un modo per gestire (disabilitare) questa commutazione automatica?

Ecco un codice di esempio per testare questo con i metodi di immissione sopra:

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); 
    } 
} 

Grazie.

+0

Solo un nitpick, ma non penso che le [forme piene/a mezza larghezza] (http://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms) abbiano qualcosa a che fare con il numero di byte che consumano in UTF -16. Non che questo aiuti con il problema. +1 – McDowell

+1

Ci sono molte cose che le persone scoprono che il JOptionPane ha torto e l'unica soluzione semplice è quella di crearne di propri. Ho creato la mia classe JDialog per Java e da allora lo utilizzo da sempre. –

risposta

1

Ok ho avuto una traccia attraverso il codice sorgente Java alla ricerca di tutto ciò che spicca;

Si chiama JOptionPane.showMessageDialog() questo overload a 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 
    } 

Quindi esaminiamo 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; 
} 

Quindi controlliamo i costruttori/s di JDialog questi tutti chiamata 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); 
} 

Qui abbiamo trovato setLocale(JComponent.getDefaultLocale());;

Così appare ogni volta che si crea un JDialog, indipendentemente dal fatto che sia indiretto o meno le impostazioni internazionali del proprio programma siano ripristinate sui valori predefiniti, immagino che ciò includa il ripristino delle impostazioni di input.

Esistono alcuni modi per impostare le impostazioni internazionali predefinite (programmaticamente, proprietà di sistema o argomenti di runtime); Details found here

Spero che ti aiuta

1

ho fatto un semplice test:

ho aperto IE, selezionato una scheda, e la barra degli indirizzi, impostare IME cinese ad essere mezzo di larghezza. Quindi fai clic su un'altra scheda, l'IME passa automaticamente alla larghezza completa.

Quindi non penso che abbia nulla a che fare con Java. È un comportamento di Windows.

Problemi correlati