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

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

ОС: Windows 7 x64

Языковые входы:

enter image description here

Я хочу переключить язык на Malayalam (Индия) [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]);

(см. нижнюю часть сообщения)

Это срабатывает иногда, а иногда и не наблюдается немного неустойчивого поведения. Иногда он не меняется на английский (США) на события 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);

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