2016-04-26 4 views
2

Я создал класс, который простирается от WindowAdapter, так что каждый раз, когда я хочу закрыть окно, он спрашивает, действительно ли вы хотите закрыть окно. Проблема возникает, когда я нажимаю «Нет». Как я могу справиться с этим так, чтобы оконное событие не «оставалось» там, и кадр продолжает пытаться его отправить? Я только возвращаю, и я ничего не могу придумать. Вот код:WindowAdapter для отправки события окна (закрывающее окно)

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

Что вы здесь делаете, должно работать. Другие слушатели также получат это событие. –

ответ

1

Проблема заключается в JFrame.processWindowEvent:

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

Независимо от того, что делает ваш слушатель, то JFrame оценивает его defaultCloseOperation и закрывает или скрывает себя.

Поэтому вам также необходимо инициализировать правильно умолчанию операцию закрытия кадра, на котором вы устанавливаете ваш слушатель, чтобы предотвратить операцию по умолчанию:

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

Вы могли бы обеспечить метод в ExitListener для облегчения этого:

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

Я уже это сделал. Проблема в том, что когда я взаимодействую с интерфейсом и меняются панели, обратный вызов проходит через все из них и продолжает показывать диалог подтверждения (новые всплывающие окна), пытаясь отправить одно и то же (окно) событие. Есть ли способ его уничтожить или что-то еще? – jari

+0

@Jari вы должны добавить небольшую примерную программу к вашему вопросу, которая демонстрирует эффект ... – wero

+0

Кажется, что это не работает ... В нем говорится: «Метод потребляет() из типа AWTEvent не отображается». – jari

2

Отъезд Closing an Application.

Он дает базовый код для этого. Основной код установил операцию закрытия по умолчанию для кадра на DO_NOTHING_ON_CLOSE.

Затем в окне WindowListener, когда пользователь подтвердит закрытие, он сбросит операцию закрытия по умолчанию на EXIT_ON_CLOSE вместо использования System.exit (0);

Вы также можете использовать класс CloseListener, который является более сложной версией (поскольку он обеспечивает больше функциональности) вашего класса ExitController.

Смежные вопросы