Мой вопрос на самом деле более общий, но я использую действие пользователя, удерживающего клавишу «Alt» и нажимающего «+», в качестве примера, показывающего трудности.
Я работаю с американской английской клавиатурой, на которой есть «=» (нижний регистр) и «+» (верхний регистр) на одной и той же клавише, поэтому, чтобы нажать «Alt +» (как может быть указано в пункте меню), я должны фактически нажать "Alt Shift =". В Java AWT нажатие «Alt Shift =" генерирует событие KeyEvent с нажатием клавиши с кодом клавиши, связанным с клавишей «=», и событие KeyEvent с нажатием клавиши, содержащее символ «±». Таким образом, нет очевидного, надежного способа программно определить, что «Alt» удерживался нажатым, пока была нажата клавиша «+».
Я мог бы сделать внутреннее сопоставление, чтобы исправить это, например, сопоставление «±» с «Alt +» или сопоставление «Shift {keycode for = }» с «+». Однако нет никаких гарантий, что это будет работать на разных раскладках клавиатуры; и это, конечно, не хороший стиль кодирования.
Если кто-нибудь может предложить способ обойти эти проблемы или, возможно, указать код, который уже справился с этой проблемой, я был бы очень признателен.
Спасибо.
1 ответ
Попробуй это:
if(e.isAltDown())
{
switch(e.getKeyChar())
{
case '+':
System.out.println("Plus");
break;
}
}
Где e
— это KeyEvent
, и он обрабатывается в методе keyPressed
.
Приведенный выше код напечатает Plus, когда вы нажмете ALT+Shift+= на указанной вами клавиатуре.
Полный рабочий код см. в приведенном ниже примере:
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.UIManager;
public class SwingTest
{
private static JFrame frame;
public static void main(String[] args) throws Exception
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
}
frame = new JFrame("Event Test");
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth()/2) + 100;
int ySize = ((int) tk.getScreenSize().getHeight()/2) + 50;
frame.setSize(xSize,ySize);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(new KeyListener()
{
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e)
{
if(e.isAltDown())
{
switch(e.getKeyChar())
{
case '+':
System.out.println("Plus");
break;
}
}
}
});
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setVisible(true);
}
});
}
}
Надеюсь, это поможет.
OS X
. Покопаемся еще какое-то время.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
Кроме того, обработка чего-либо например, «Alt-e» проблематичен, так как он не вызывает keyTyped при нажатии клавиши, а мониторинг нажатий «Alt-e Alt-<какой-то другой символ>» действительно болезненный с помощью keyTyped действительно болезненный, так как это может привести к акценту символы.