KeyListener, um einen Dialog per ESC zu schließen

vfl_freak

Premium-User
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.
Aber 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 und bitte um passende Denkanstöße

Danke und Gruß
Klaus
 

vfl_freak

Premium-User
Moin,

oh, aber das müsste er doch eigentlich schon, oder etwa nicht :confused:
Java:
public abstract class DlgEditorGeneric extends JDialog { ... }

//...

public class DlgNewsEditable extends DlgEditorGeneric { ... }

Gruß
Klaus
 

vfl_freak

Premium-User
Moin,

so, hat leider etwas gedauert, aber ich habe eine Lösung gefunden, die ich hier noch schnell für die Nachwelt posten möchte:

Ich habe einen Ansatz gefunden, der Keybindings verwendet (vgl. http://www.javaworld.com/javaworld/javatips/jw-javatip72.html?page=1)

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

Gruß
Klaus
 

Neue Beiträge