Tastaturereignisse

Status
Nicht offen für weitere Antworten.

Marc-André Aßbrock

Aktives Mitglied
Hallo!

Ich bin momentan dabei mir mit dem JMF (Java Media Framework) einen eigenen kleinen Player zusammenzubasteln. Nun möchte ich diesen Player auch über die Tastatur steuern (Datei öffnen etc.).

Als erstes habe ich versucht im JFrame bzw. JWindow einen KeyListener zu registrieren. Funktioniert aber nicht. Kann es sein, dass die Tastaturkomandos immer nur zu den JButton geleitet werden, der grade als aktiv makiert ist, sodass man also dort die Listener registrieren muss?
Ich habe schon einen anderen Weg gefunden, mich interessiert es aber halt warum es so nicht funktioniert hat.

MfG
M.A.
 

The_S

Top Contributor
Der KeyListener springt nur dann an, wenn auch wirklich die Komponente, zu die der Listener geaddet wurde den Fokus hat. Wenn jetzt also dein JButton den Fokus hat, der KeyListener aber nur beim JPanel registriert ist wird auch kein KeyEvent ausgelöst.
 

Marc-André Aßbrock

Aktives Mitglied
OK, danke. Das hatte ich mir ja schon gedacht.

Momentan habe ich es wie folgt gelößt (Codeausschnitt):

Code:
// Datenfelder (Modifikatoren muss ich mir noch gedaknen zu machen):
// Die Inneren Klassen für die Unterschiedlichen Aktionen:
    private FullScreenAction fullScreenAction = new FullScreenAction();
    private FullScreenMouseAction fullScreenMouseAction = new FullScreenMouseAction();
    private OpenAction openAction = new OpenAction();
    private CloseAction closeAction = new CloseAction();
    
// KeyStorks
    public static final KeyStroke ksF = KeyStroke.getKeyStroke(KeyEvent.VK_F,0,false);
    public static final KeyStroke ksO = KeyStroke.getKeyStroke(KeyEvent.VK_O,0,false);
    public static final KeyStroke ksC = KeyStroke.getKeyStroke(KeyEvent.VK_C,0,false);


// Konstruktor
        JButton öffnen = new JButton(new ImageIcon("öffnen.gif"));
        öffnen.setBackground(Color.BLACK);
        öffnen.addActionListener(openAction);
        öffnen.getInputMap().put(ksO,"öffnen");
        öffnen.getInputMap().put(ksC,"schließen");
        öffnen.getInputMap().put(ksF,"fullScreen");
        öffnen.getActionMap().put("öffnen", openAction);
        öffnen.getActionMap().put("schließen", closeAction);
        öffnen.getActionMap().put("fullScreen", fullScreenAction);

Was haltet ihr davon? Ich finde es ist so ziemlich viel Arbeit, dies bei jedem Button zu machen. Ich würde mit einer Methode die Input- und Action-Maps für jeden Button füllen, dann ist der Code zumindest etwas kürzer, aber geht das ganze auch eleganter und einfacher?
 

Marc-André Aßbrock

Aktives Mitglied
OK, soweit so gut. Die Methode ist sehr praktisch. Aber es gibt doch noch Probleme:
Ich habe in dem Programm ein Vollbild-Modus integriert, indem ich alles bis auf die Videofläche ausblende. Wie kann man dann die Tastaturkomandos abfangen? Mit einem KeyListener auf dem Videobereich will es nicht funktionieren.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben