2014-10-06 21 views
5

Özel bir başlık çubuğu ve özel resizer ile birlikte, ayrılmamış bir JFrame kullanıyorum. Her şey iyi çalışıyor ancak JFrame'i renklendirmediğimde Windows-Left/Right anahtar bağlamaları desteğini kaybediyorum (Windows tarafından yerel olarak uygulanmış gibi görünüyor). Uygulamam için bu özelliği yeniden kullanmak istiyorum. Sorunum: Windows tuşunun basılı olup olmadığını bir anahtar dinleyicide algılayabilirim, ancak Windows anahtarıyla (InputEvent öğesinde değiştirici WINDOWS_MASK_DOWN) birlikte başka bir tuşun (durumumda sol/sağ) basıldığını algılayamıyorum. Muhtemelen birisi bir çözüm buluyor mu? İşte Undecorated JFrames içinde Windows-Sol ve Windows-Sağ için Destek

kodum: Ben sistemimde olarak düzgün test edemedi Eh

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 öğesinde WINDOWS_MASK_DOWN değiştiricisi yok.) KeyReleased olayı için bir olay üretilmesine rağmen, sağ/sol tuşa basıldığında (JDK7'de) hiçbir olay oluşturulmaz. Bu bana Windows'un olayı yakaladığını söylüyor. Windows + Down pencereyi geri yüklemese de Windows + Up tuşunun pencereyi en üst düzeye çıkarması nedeniyle sağ/sol tuş işlevinin çalışmadığı gariptir. Yani kesinlikle tutarsızlıklar var. Çözümü bilmiyorum. – camickr

+0

Bu konuda herhangi bir güncelleme var mı? Aynı sorunu yaşıyorum ve buna bir çözüm arıyorum. – Sebastian

cevap

1

, , Windows + Sol veya Sağ yakalanan ve Windows tarafından işlenen bile oyulmamış kareler için, kullanılmayan kombinasyon Windows + A için başka bir durum eklendiğinde, ana makine sistemi d ise aşağıdaki kodun çalıştığını kanıtlamıştır. OES tuşu kısayolunu tüketmek değil:

(Güncelleme: Windows tüketir anahtar pres olayı, Sağ catched edilebilir , Windows + Sol veya önemli bir salımını gibi görünüyor beri)

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

Bir bileşendeki sıradan bir anahtar dinleyicisi, bileşen Windows düğmesine basıldığında odağı kaybettiği için çalışmaz gibi görünüyor.

+0

Cevabınız için teşekkürler, ancak öneriniz çalışmaz (en azından Windows bilgisayarımda). –

+0

"Kazanma + ok" veya "win + A" için bile çalışmıyor mu? Korkarım ki, pencereler çalışmıyor olsalar bile "kazanmak + ok" keycombosunu ele geçiriyor. Ama 'kazan + A' makinemde, win7'de ve hem jdk7 hem de jdk8'de çalıştı. Bu nedenle, alabileceğiniz en yakın şeyden korkuyorum, başka bir deyişle, eğer işe yaramıyorsa, çözüm olmayacaktır. – Holger

+0

Windows + A çalışır, ancak benim amacım Windows + ArrowSol/Sağ olmasıdır, çünkü kullanıcılar bu anahtarları bilirler. –