2014-10-06 19 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