Swing KeyListener, um einen Dialog per ESC zu schließen

VfL_Freak

Top Contributor
Hallo zusammen,

ich kämpfe jetzt seit gestern morgen mit dem genannten Problem ....

Ich soll für etliche Fenster/Dialoge einbauen, dass sie sich per <ESC> schließen. Bei mehreren einzelnen Dialog-Klassen hat dies auch anstandslos geklappt.
Beispiel:
Java:
public class MyDlg extends JDialog implements KeyListener
{
    // ...

    private void jbInit() throws Exception 
    {
        addKeyListener(this);
        // ...
    }

    // ...

    public void keyPressed( KeyEvent event )
    {
        if( event.getKeyCode() == KeyEvent.VK_ESCAPE )
	{
	    setVisible(false);
	    dispose();
	}

    } // keyPressed
}

So weit - so gut :)

Nun hat unsere Anwendung aber eine ganze Reihe Dialogfenster, die generisch über eine zentrale Klasse erstellt werden. Ich versuche es mal skizzenhaft darzustellen :
Java:
// Erezugen eine "News"-Dialogs über die generische Klasse "DlgEditorGeneric"
DlgEditorGeneric dlgN1 = new DlgNewsEditable( this, "News", DlgEditorGeneric.BUTTONMODE_SCHLIESSEN, false, iMaskenKNZ);


public class DlgNewsEditable  
extends DlgEditorGeneric
{
    public DlgNewsEditable() 
    {
        setDialogFont(new java.awt.Font("Monospaced", 0, 13));
        setButtonsEnabled(BUTTONMODE_SCHLIESSEN, false);
        m_IDlgEditorActions = new DlgNewsEditableActions();
    }
}


public class DlgNewsEditableActions 
implements IDlgEditorActions 
{
    public DlgNewsEditableActions() 
    {}
	
    public void writeData( DlgEditorGeneric theDlg, String strData )
    { 
         // muss überschrieben werden !!
    }

    public void doubleClickedData( DlgEditorGeneric theDlg, String strData )
    { 
         // muss überschrieben werden !!
    }

    public void dataChanged( DlgEditorGeneric theDlg )
    { 
         // muss überschrieben werden !!
    }
	
    public String readData( DlgEditorGeneric theDlg )
    {
         String strData = "";
         WSRequestNews wsc = new WSRequestNews();
         byte[ ] bErg = wsc.communicate();
         byte[] bRes = null;
         if (bErg != null) 
	 {
              // irgendwas
         }
         return strData;
    } // readData
}


/* Interface für Actions des generischen Dialogs. Abgeleitete Dialoge implementieren
 * dieses Interface und müssen die Memberfunktionen überschreiben */
public interface IDlgEditorActions 
{
	public String readData(DlgEditorGeneric theDlg);
	public void writeData(DlgEditorGeneric theDlg, String strData);
	public void doubleClickedData(DlgEditorGeneric theDlg, String strData);
	public void dataChanged(DlgEditorGeneric theDlg);
}


public abstract class DlgEditorGeneric extends JDialog 
{
    // ...
    IDlgEditorActions m_IDlgEditorActions = null;
    // ...
}

Ich hoffe, das war soweit verständlich ;)

Ich habe dann die Klasse "DlgEditorGeneric" um einen KeyListener, so wie im ersten Beispiel beschrieben (also mit der Methode "keyPressed"), erweitert.

Dann meckerte der Compiler
Der Typ "DlgNewsEditable" muss die übernommene abstrakte Methode keyListener.keyPressed(KeyEvent) implementieren!
Also habe ich diese Methode auch dort eingebaut .... leider ohne Erfolg :-(

Auch Versuche, das Ganze über das "interface IDlgEditorActions" resp. "DlgNewsEditableActions" zu lösen, klappen nicht!

Habe ich hier irgendwo einen Gedankenfehler?
Oder kann das alles aufgrund des Interface nicht klappen?

Bin im Moment ein bisschen ratlos :autsch: und bitte um passende Denkanstöße :D

Danke und Gruß
Klaus
 

KrokoDiehl

Top Contributor
Hallo.
Ich habe bisher einen anderen Ansatz verwendet, mit dem ich sehr zufrieden bin. Und zwar geht dieser über Keybindings (s. Java Tip 72).
Ich verwende allerdings noch die Basismethode:
Java:
@Override
protected JRootPane createRootPane() {
    JRootPane root = super.createRootPane();
    root.registerKeyboardAction(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            MyDialog.this.setVisible(false);
        }
    }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
    JComponent.WHEN_IN_FOCUSED_WINDOW);
    
    return root;
}
 

VfL_Freak

Top Contributor
Moin KrokoDiehl (oder darf man auch "Dundee" sagen ?? :D),

Danke, das klingt nach einem interessanten Ansatz, werde ich morgen mal ausprobieren ....

Stellt sich für nur noch die dumme Frage :

Kommt das dann in die abstrakte Klasse ("DlgEditorGeneric") oder doch eher in die Ableitung ("DlgNewsEditable") ???:L

Gruß
Klaus
 

KrokoDiehl

Top Contributor
Prinzipiell so hoch wie möglich in der Hierarchie, zumindest solange es ein Standardverhalten ist.

Eine Sache über die man sich aber Gedanken machen muss, ist die Aktion die auf das ESC folgt. In meinem Beispiel wird der Dialog einfach geschlossen, aber vielleicht gibt es einige Subklassen die beim Schließen noch irgendwas machen sollen - z.B. ein
Code:
dipose()
.

Um die normale "windowClosing"-Behandlung aufzurufen kann man in der Aktion auch folgendes machen:
Java:
MyDialog.this.dispatchEvent(new WindowEvent(MyDialog.this, WindowEvent.WINDOW_CLOSING));
(... vielleicht geht das auch geschickter).
Damit wird das gleiche gemacht wie beim Klick auf das X vom Dialog.
 

VfL_Freak

Top Contributor
Moin,

Prinzipiell so hoch wie möglich in der Hierarchie, zumindest solange es ein Standardverhalten ist.
Ok, das war eigentlich auch mein Ansatz ...

Eine Sache über die man sich aber Gedanken machen muss, ist die Aktion die auf das ESC folgt. In meinem Beispiel wird der Dialog einfach geschlossen, aber vielleicht gibt es einige Subklassen die beim Schließen noch irgendwas machen sollen - z.B. ein
Code:
dipose()
.
eigentlich soll nur der aktuelle Dialog geschlossen werden ...


Um die normale "windowClosing"-Behandlung aufzurufen kann man in der Aktion auch folgendes machen:
Java:
MyDialog.this.dispatchEvent(new WindowEvent(MyDialog.this, WindowEvent.WINDOW_CLOSING));
(... vielleicht geht das auch geschickter).
Damit wird das gleiche gemacht wie beim Klick auf das X vom Dialog
oh oh, jetzt schwant mir Böses.
Irgendwie ist der "Klick auf das X vom Dialog" applikationsweit deaktiviert (unser Chef wollte das so - ich muss mir die Stelle mal raussuchen).
Mal sehen, vielleicht kann ich ihn aus überreden, das wieder zu aktivieren und dann nur bei bestimmten Dialogen zu unterbinden ....

Erstmal Danke für Deine Mühe!
Gruß
Klaus
 

KrokoDiehl

Top Contributor
oh oh, jetzt schwant mir Böses.
Irgendwie ist der "Klick auf das X vom Dialog" applikationsweit deaktiviert (unser Chef wollte das so - ich muss mir die Stelle mal raussuchen).
Mal sehen, vielleicht kann ich ihn aus überreden, das wieder zu aktivieren und dann nur bei bestimmten Dialogen zu unterbinden ....
Moment, nicht dass wir aneinander vorbeireden. Du weist über die
Code:
registerKeyboardAction()
der Escape-Taste eine Aktion zu. In dieser Aktion kannst du alles machen. Mit einem
Code:
setVisible(false)
wird der Dialog einfach geschlossen. Aber wenn man die normale window-closing-Behandlung haben will, muss die dort rein.
 

VfL_Freak

Top Contributor
Moin Kroko,

sorry, dass ich mich erst jetzt wieder melde, aber ich musste an andere wichtige Aufgaben ran ....

So, ich habe es jetzt mittels der Keybindings aus Deinem ersten Post (gesetzt in der abstrakten Klasse "DlgEditorGeneric") hinbekommen!

Nochmals Danke für die Unterstützung :)
Gruß
Klaus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3
E KeyListener AWT, Swing, JavaFX & SWT 5
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben