Java 如何为国际键盘定义可读快捷键?
我想我可以使用键盘键的字符串表示来配置快捷键,即让某人在资源包中定义一个击键,并将该值直接传递给Java 如何为国际键盘定义可读快捷键?,java,swing,keyboard,keyboard-shortcuts,Java,Swing,Keyboard,Keyboard Shortcuts,我想我可以使用键盘键的字符串表示来配置快捷键,即让某人在资源包中定义一个击键,并将该值直接传递给javax.swing.keystroke.getKeyStroke(string)。但这不适用于国际键盘,例如阿拉伯语。在那里,键盘键只是高级按键类型的事件,但快捷键需要定义为具有按键代码表示的低级按键按下事件。如果一个人知道相应的钥匙代码,那么他可以使用该钥匙的英文表示来让它工作,但是他应该从哪里知道这一点呢?我编写了一个键侦听器,它告诉我这一点,但在以编程方式解析字符串时,我需要一些东西。有没有
javax.swing.keystroke.getKeyStroke(string)
。但这不适用于国际键盘,例如阿拉伯语。在那里,键盘键只是高级按键类型的事件,但快捷键需要定义为具有按键代码表示的低级按键按下事件。如果一个人知道相应的钥匙代码,那么他可以使用该钥匙的英文表示来让它工作,但是他应该从哪里知道这一点呢?我编写了一个键侦听器,它告诉我这一点,但在以编程方式解析字符串时,我需要一些东西。有没有想过在快捷方式中使用依赖于自然语言的键表示法
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class InternationalKeyStroke {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 400));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
final JLabel label = new JLabel("Type the key you want to know the key code of!");
panel.add(label);
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
String text = "Key " + e.getKeyChar() + " needs to be configured with char ='" + (char) e.getKeyCode() + "'";
label.setText(text);
System.out.println(text);
}
});
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
KeyStroke working = KeyStroke.getKeyStroke("control typed A");
label.registerKeyboardAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("Working action " + event);
}
}, working, JComponent.WHEN_IN_FOCUSED_WINDOW);
KeyStroke target = KeyStroke.getKeyStroke("control typed ش");
System.out.println(target);
label.registerKeyboardAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("Not working Action " + event);
}
}, target, JComponent.WHEN_IN_FOCUSED_WINDOW);
}
});
}
}
这似乎是不可能的。我检查了Microsoft Office和Eclipse,它们都没有使用当前区域设置的真正unicode字母,但相应的虚拟密钥代码的字母…不相关:registerKeyboardAction是非常过时的api,从jdk 1.3开始,它就被inputMap/actionMap取代。不过,可能也是同样的问题;-)