2016-04-26 5 views
2

Ich habe eine Klasse erstellt, die von WindowAdapter erweitert wird, so dass jedes Mal, wenn ich ein Fenster schließen möchte, Sie gefragt werden, ob Sie das Fenster wirklich schließen möchten. Das Problem tritt auf, wenn ich auf "Nein" klicke. Wie kann ich damit umgehen, dass das Fenster-Event dort nicht "bleibt" und der Frame versucht, es zu versenden? Ich mache nur eine Rückkehr, und ich kann nichts finden. Hier ist der Code:WindowAdapter zum Versenden eines Fensterereignisses (schließendes Fenster)

public class ExitController extends WindowAdapter{ 

    @Override 
    public void windowClosing(WindowEvent windowEvent) { 
     if(JOptionPane.showConfirmDialog(null,"Are you sure to close this window?", 
     "Really Closing?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) 
     == JOptionPane.YES_OPTION){ 
        System.exit(0); 
       } else { 
        return; 
       } 
      } 
     } 
+0

Was Sie hier tun, sollte funktionieren. Andere Zuhörer würden das Ereignis ebenfalls erhalten. –

Antwort

1

Das Problem in JFrame.processWindowEvent ist:

protected void processWindowEvent(WindowEvent e) { 
    super.processWindowEvent(e); // --> this will call your listener 

    if (e.getID() == WindowEvent.WINDOW_CLOSING) { 
     switch(defaultCloseOperation) { 
      case HIDE_ON_CLOSE: 
      setVisible(false); 
      break; 
      case DISPOSE_ON_CLOSE: 
      dispose(); 
      break; 
      case DO_NOTHING_ON_CLOSE: 
      default: 
      break; 
      case EXIT_ON_CLOSE: 
       // This needs to match the checkExit call in 
       // setDefaultCloseOperation 
      System.exit(0); 
      break; 
     } 
    } 
} 

Unabhängig davon, was Ihre Zuhörer tut, das JFrame wertet seine defaultCloseOperation und schließt oder versteckt sich.

Daher müssen Sie auch den richtigen Standard-Schließvorgang des Rahmens initialisieren, auf das Sie Ihre Zuhörer installieren, um den Standardbetrieb zu verhindern:

frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new ExitController()); 

Sie eine Methode in ExitListener bieten könnte dies erleichtern:

public class ExitController extends WindowAdapter { 
    public void installOn(JFrame frame) { 
     frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(this); 
    } 
+0

Das habe ich schon gemacht. Das Problem ist wirklich, dass, wenn ich mit der Schnittstelle interagiere und die Tafeln sich ändern, der Rückholanruf durch alle von ihnen geht und den bestätigenden Dialog (neue Pop-ups) immer wieder zeigt, wenn ich versuche, dasselbe (Fenster-) Ereignis zu senden. Gibt es eine Möglichkeit, es oder etwas zu konsumieren? – jari

+0

@Jari sollten Sie Ihrer Frage ein kleines Beispielprogramm hinzufügen, das den Effekt zeigt ... – wero

+0

Es scheint nicht zu funktionieren ... Es heißt "Die Methode consume() vom Typ AWTEvent ist nicht sichtbar". – jari

2

Auschecken Closing an Application.

Es gibt einige grundlegende Code dafür. Der Basiscode würde den standardmäßigen Schließvorgang des Rahmens auf DO_NOTHING_ON_CLOSE setzen.

Dann im WindowListener, wenn der Benutzer das Schließen bestätigt, wird die Standard-Schließen-Operation auf EXIT_ON_CLOSE zurückgesetzt, anstatt System.exit (0) zu verwenden;

Sie können auch die Klasse CloseListener verwenden, die eine komplexere Version der yee ExitController-Klasse ist (weil sie mehr Funktionalität bietet).

Verwandte Themen