2014-10-06 6 views
5

Uso una JFrame non decorata con una barra del titolo personalizzata e un resizer personalizzato. Tutto funziona bene ma quando creo un JFrame non decorato, perdo il supporto per i collegamenti dei tasti Windows-Left/Right (sembra che sia nativo implementato da Windows). Voglio reimplementare questa funzionalità per la mia applicazione. Il mio problema: posso rilevare in un ascoltatore di chiavi se il tasto Windows è premuto, ma non riesco a rilevare se un altro tasto (sinistra/destra nel mio caso) viene premuto insieme al tasto Windows (nessun modificatore WINDOWS_MASK_DOWN in InputEvent). Probabilmente qualcuno conosce una soluzione alternativa?Supporto per Windows-Left e Windows-Right in JFrames non decorati

Ecco il mio codice:

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 '(nessun modificatore WINDOWS_MASK_DOWN in InputEvent) .' Nessun evento viene nemmeno generato quando si preme il tasto destro/sinistro (in JDK7), sebbene venga generato un evento per l'evento keyReleased. Questo mi dice che Windows sta intercettando l'evento. È strano che la funzionalità tasto destro/sinistro non funzioni perché il tasto Windows + Su fa ingrandire la finestra, sebbene Windows + Giù non ripristini la finestra. Quindi ci sono sicuramente delle incongruenze. Non conosco la soluzione. – camickr

+0

Eventuali aggiornamenti su questo? Sto avendo lo stesso problema e sto cercando una soluzione a questo. – Sebastian

risposta

1

Beh, non ho potuto testarlo correttamente come sul mio sistema, di Windows + Sinistra o Destrastati intercettati ed elaborati da Windows anche per cornici non decorati, tuttavia aggiungendo un altro caso per la combinazione non utilizzata Windows + A ha dimostrato che il seguente codice funziona se il sistema host d OES non consumare il tasto di scelta rapida:

(Aggiornamento: dal momento che sembra essere l'evento pressato chiave che consuma di Windows, un rilascio chiave di di Windows + Sinistra o Destra può essere catched)

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

Sembra che un ordinatore di chiavi ordinario su un componente non funzioni perché il componente perde lo stato attivo quando si preme Windows.

+0

Grazie per la risposta, ma il tuo suggerimento non funziona (almeno sul mio computer Windows). –

+0

Non funziona per quanto riguarda 'vinci + freccia' o anche per' vinci + A'? Temo che Windows stia intercettando i keycombos di 'win + arrow' anche se non funzionano. Ma 'win + A' ha funzionato sulla mia macchina, win7 e sia jdk7 che jdk8. Pertanto, temo che sia la cosa più vicina che puoi ottenere, in altre parole, se ciò non funziona, non ci sarà soluzione. – Holger

+0

Windows + A funziona, ma il mio obiettivo è Windows + ArrowLeft/Right perché gli utenti conoscono queste chiavi. –