2015-04-07 28 views
14

Przeczytałem stare pytania podobne do tych, które nie pomogły w mojej sprawie.Zmiana/zmiana języka Windows 7 przy użyciu java

OS: Windows 7 x64

Wejścia Język:

enter image description here

Chcę zmienić język na malajalam (Indie)[Google Input tools] tylko dla jednego jTextField w Java Swing Aplikację i przełącz z powrotem na Angielski (Stany Zjednoczone) dla pozostałych pól.

UPDATE:

Pole malyalamField jest javax.swing.JTextField

 javax.swing.JTextField malyalamField= new javax.swing.JTextField(); 
     malyalamField.setFont(new java.awt.Font("Arial Unicode MS", 0, 12)); 

malajalam (Indie):Język regionalny stosowany w Południowym indyjskim stanie Kerala nazwie.

starałem się osiągnąć przez wypalanie Alt + LShift Kombinacja klawiszy z java na FocusGained i FocusGained wydarzeń

int keyInput[] = { KeyEvent.VK_ALT, KeyEvent.VK_SHIFT}; 
Robot shiftkey=null; 
Robot altkey=null; 
try { 
    shiftkey = new Robot(); 
    altkey=new Robot(); 
} catch (AWTException e) { 
    e.printStackTrace(); 
} 

altkey.keyPress(keyInput[0]); 
shiftkey.keyPress(keyInput[1]); 

altkey.keyRelease(keyInput[0]); 
shiftkey.keyRelease(keyInput[1]); 

(Zobacz dno postu)

Działa to czasami, a czasami nie zaobserwowano drobnych błędnych zachowań. Czasami nie zmienia się z powrotem na Angielski (Stany Zjednoczone) na FocusLost zdarzeń nawet po wykonaniu kodu.
enter image description here

Próbowałem też za pomocą

  malyalamField.enableInputMethods(true); 
     malyalamField.getInputContext().selectInputMethod(new Locale("MY", "IN")); 

Ale to też nie działa i selectInputMethod() powrócił NULL

I może być robić selectInputMethod() z niewłaściwym Locale

dzień teraz najlepsze, co mam, to odpalenie klawiszy od java. Czy istnieje sposób, w jaki można to osiągnąć?

przykładowy kod:

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 

public class LanguageChangeForm extends javax.swing.JFrame { 
    public LanguageChangeForm() { 
     initComponents(); 
    } 
    @SuppressWarnings("unchecked") 
    private void initComponents() { 

     englishField1 = new javax.swing.JTextField(); 
     malayalamFileld = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jLabel3 = new javax.swing.JLabel(); 
     englishField2 = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     malayalamFileld.setFont(new java.awt.Font("Arial Unicode MS", 0, 11)); 
     malayalamFileld.addFocusListener(new java.awt.event.FocusAdapter() { 
      public void focusGained(java.awt.event.FocusEvent evt) { 
       malayalamFileldFocusGained(evt); 
      } 
      public void focusLost(java.awt.event.FocusEvent evt) { 
       malayalamFileldFocusLost(evt); 
      } 
     }); 

     jLabel1.setText("English Field"); 
     jLabel2.setText("Malayalam Field"); 
     jLabel3.setText("English Field"); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(47, 47, 47) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
          .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
          .addComponent(englishField2, javax.swing.GroupLayout.PREFERRED_SIZE, 131, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
          .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 131, Short.MAX_VALUE) 
          .addComponent(englishField1)) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 49, Short.MAX_VALUE) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(malayalamFileld, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGap(34, 34, 34)))) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(49, 49, 49) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel1) 
        .addComponent(jLabel2)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(englishField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(malayalamFileld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(18, 18, 18) 
       .addComponent(jLabel3) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(englishField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(152, Short.MAX_VALUE)) 
     ); 

     pack(); 
    } 

    private void malayalamFileldFocusGained(java.awt.event.FocusEvent evt) { 
     try{ 
     int keyInput[] = { KeyEvent.VK_ALT, KeyEvent.VK_SHIFT,,KeyEvent.VK_2}; 
     Robot robitkey=null; 

     try { 
      robitkey= new Robot(); 

     } catch (AWTException e) { 

      e.printStackTrace(); 
     } 
      robitkey.keyPress(keyInput[0]); 
      robitkey.keyPress(keyInput[1]); 
      robitkey.keyPress(keyInput[2]); 
      robitkey.keyRelease(keyInput[0]); 
      robitkey.keyRelease(keyInput[1]); 
      robitkey.keyRelease(keyInput[2]); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    private void malayalamFileldFocusLost(java.awt.event.FocusEvent evt) { 


     try{ 
     int keyInput[] = { KeyEvent.VK_ALT, KeyEvent.VK_SHIFT,,KeyEvent.VK_1}; 
     Robot robitkey=null; 

     try { 
      robitkey= new Robot(); 

     } catch (AWTException e) { 

      e.printStackTrace(); 
     } 
      robitkey.keyPress(keyInput[0]); 
      robitkey.keyPress(keyInput[1]); 
      robitkey.keyPress(keyInput[2]); 
      robitkey.keyRelease(keyInput[0]); 
      robitkey.keyRelease(keyInput[1]); 
      robitkey.keyRelease(keyInput[2]); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 
    public static void main(String args[]) { 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(LanguageChangeForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(LanguageChangeForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(LanguageChangeForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(LanguageChangeForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new LanguageChangeForm().setVisible(true); 
      } 
     }); 
    } 
    private javax.swing.JTextField englishField1; 
    private javax.swing.JTextField englishField2; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JTextField malayalamFileld; 

} 
+1

Jakiego rodzaju jest 'malyalamField', proszę napisać przykład, z którego możemy łatwo odtworzyć. –

+0

@ Jean-FrançoisSavard dodał żądane szczegóły dotyczące malayalamField –

+0

@AndrewThompson, Dodano link przykładowego kodu. –

Odpowiedz

3

To narodowe trzeba:

Locale loc = new Locale("ml", "IN"); 
malayalamFileld.setLocale(loc); 
malayalamFileld.getInputContext().selectInputMethod(loc); 

Ale trzeba wiedzieć, że ten prace tylko jeśli użytkownik, który rozpoczął swój program jest Administrator/Root !!!

+0

czyli bezużyteczna funkcja: przeszkadzanie użytkownikom za pomocą wyświetlacza uac nie jest szczególnie przyjazne dla użytkownika. – Tschallacka

+0

To wygląda na najbardziej prawdopodobne rozwiązanie, wkrótce je przetestujemy. Kontrola konta użytkownika nie stanowi problemu. On zawsze można wyłączyć. –

+0

pod warunkiem, że linki nie działają teraz. – ThilinaMD

Powiązane problemy