我使用带有自定义标题栏和自定义缩放器的未修饰的JFrame。一切正常,但是当我制作一个JFrame未修饰时,我失去了对Windows-Left / Right键绑定的支持(似乎它是由Windows本机实现的)。我想为我的应用程序重新实现此功能。我的问题:我可以在一个关键监听器中检测到是否按下了Windows键,但我无法检测是否另一个键(在我的情况下为左/右)与Windows键一起按下(在InputEvent中没有修饰符WINDOWS_MASK_DOWN)。可能有人知道解决方法吗?
这是我的代码:
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class HeadlessFrameTest {
public static void main(String[] args) {
final JFrame frm = new JFrame("Test");
final JTextField field = new JTextField();
frm.add(field, BorderLayout.NORTH);
field.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e);
}
});
frm.setUndecorated(true);
frm.setSize(500, 550);
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
答案 0 :(得分:1)
好吧,我无法在我的系统上正确测试, Windows + 左或右 是即使对于未修饰的帧也会截获并处理Windows,但是为未使用的组合添加另一种情况 Windows + A 证明如果主机系统不使用以下代码关键捷径:
(更新:因为它似乎是Windows消耗的按键事件, Windows + Left 或 Right 的关键版本可以被抓住了)
final JFrame frm = new JFrame("Test");
final JTextField field = new JTextField();
frm.add(field, BorderLayout.NORTH);
frm.getToolkit().addAWTEventListener(new AWTEventListener() {
boolean winDown;
public void eventDispatched(AWTEvent event) {
KeyEvent ev=(KeyEvent)event;
final boolean pressed = ev.getID()==KeyEvent.KEY_PRESSED;
if(ev.getKeyCode()==KeyEvent.VK_WINDOWS) winDown=pressed;
else if(winDown) switch(ev.getKeyCode()) {
case KeyEvent.VK_LEFT:
System.out.println("windows + LEFT "+(pressed?"pressed":"released"));
break;
case KeyEvent.VK_RIGHT:
System.out.println("windows + RIGHT "+(pressed?"pressed":"released"));
break;
case KeyEvent.VK_A:
System.out.println("windows + A "+(pressed?"pressed":"released"));
break;
}
}
}, KeyEvent.KEY_EVENT_MASK);
frm.setUndecorated(true);
frm.setSize(500, 550);
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setVisible(true);
组件上的普通键侦听器似乎不起作用,因为当按下 Windows 时组件失去焦点。