Изменение / переключение языка ввода Windows 7 с помощью java

прочитал старые вопросы, подобные этому, ни один из них не помог моему делу.

ОС: Windows 7 x64

Язык Входы:

enter image description here

я хочу переключить язык на Малаялам(Индия)[Google Input tools] только для одного jTextField на Java Swing применение и переключиться обратно в Английский(США) для остальных полей.

обновление:

поле malyalamField это javax.swing.JTextField

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

Малаялам(Индия): региональный язык, используемый в южно-индийском штате Керала.

я пытался добиться этого, стреляя Alt + LShift комбинация клавиш с java на FocusGained и FocusGained событий

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

(см. внизу поста)

это работает иногда, и иногда это не немного неустойчивое поведение было наблюдаемый. Иногда он не меняется обратно на Английский(США) on FocusLost события даже после выполнения кода.
enter image description here

я также попытался с помощью

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

но это тоже не сработало и selectInputMethod() вернулся NULL

возможно, я делаю selectInputMethod() неправильно Locale

пока лучшее, что я является огонь, хранящейся у java.Есть ли способ это может быть достиг?

ПРИМЕР КОДА :

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 ответов


это локаль вам нужно:

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

но вы должны знать, что этот работает только если пользователь, который запустил вашу программу, является администратором / Root!!!