2014-10-06 39 views
5

我使用带有自定义标题栏和自定义缩放器的未装饰JFrame。所有的工作正常,但是当我做一个JFrame undecorated时,我失去了Windows的左/右键绑定的支持(似乎它本地实现的Windows)。我想为我的应用程序重新实现此功能。我的问题:我可以在关键侦听器中检测是否按下了Windows键,但我无法检测到另一个键(在我的情况下为左/右)是否与Windows键一起按下(InputEvent中没有修饰符WINDOWS_MASK_DOWN)。可能有人知道一个解决方法?在未装饰的JFrame中支持Windows-Left和Windows-Right

这里是我的代码:

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); 
    } 

} 
+1

+1'(InputEvent中没有修饰符WINDOWS_MASK_DOWN).'按下右/左键(在JDK7中)时,即使为keyReleased事件生成事件,也不会生成事件。这告诉我Windows正在拦截事件。奇怪的是,右键/左键功能不起作用,因为Windows +向上键最大化窗口,尽管Windows +向下不会恢复窗口。所以肯定存在不一致。我不知道解决方案。 – camickr 2014-10-06 18:49:05

+0

这有什么更新?我有同样的问题,我正在寻找解决方案。 – Sebastian 2016-09-12 13:48:17

回答

1

嗯,我不能正确测试它作为我的系统上,的Windows + 拦截和由Windows处理甚至对于未修饰的框架,但是为未使用的组合添加另一个案例Windows + A证明如果主机系统d OES不消耗快捷键:

(更新:因为它似乎是哪个Windows消耗按下的键事件,的Windows + 的一个键释放右可以钓到)

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时组件失去焦点。

+0

感谢您的回答,但您的建议不起作用(至少在我的Windows计算机上)。 – 2014-10-06 19:27:53

+0

关于'win + arrow'或甚至'win + A'都无法工作?我担心,即使窗口不工作,窗口也会拦截“win + arrow”键组合。但是'win + A'确实可以在我的机器上运行,win7以及jdk7和jdk8。因此,恐怕这是你能得到的最接近的东西,换句话说,如果这不起作用,就没有办法解决。 – Holger 2014-10-07 08:29:05

+0

Windows + A有效,但我的目标是Windows + ArrowLeft/Right,因为用户知道这些密钥。 – 2014-10-07 08:30:47