Изменение/Переключение языка ввода 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!!!