2009-12-31 3 views
5

Я добавил состояние слушателя окно следующим образом:закрыть окно событий в Java

this.addWindowStateListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Но когда я с помощью кнопки X закрыть событие не вызывается. Я думаю, что это связано с картой netbean jdesktop. Но я не могу найти, что может быть проблемой. Спасибо за помощь.

ответ

9

windowClosing является частью интерфейса WindowListener. Используйте addWindowListener вместо addWindowStateListener.

+2

+1. обратите внимание, что 'WindowStateListener' используется для обработки событий, которые запускаются, когда окно минимизировано или максимизировано и т. д., но не закрыто. – akf

3

Обычно для этого используется WindowListener.

Отметьте Closing an Application для подхода, который я использую, хотя я должен признать, что я никогда не пробовал его с Netbeans, так как я не использую IDE.

0

Как указано в документации по Java, чтобы фактически закрыть окно, слушатель должен вызывать метод dispose или setVisible (false) окна.

-2

Как уже указал на WindowListener что вы после ... но вы должны сделать это теперь, когда переопределяется метод:

this.addWindowStateListener(
    new WindowAdapter() 
    { 
     @Overrides 
     public void windowClosing(WindowEvent e) 
     { 
      ExitAction.getInstance().actionPerformed(null); 
     } 

    }); 

Тогда компилятор сообщит вам, когда вы на самом деле не переопределяя метод и вместо этого добавляя новый метод (который в этом случае никогда не будет вызываться).

+0

WindowAdapter - это как WindowListener, так и WindowStateListener. Проблема здесь в том, что она добавляется как WindowStateListener, поэтому методы, которые она имеет в качестве WindowListener, не вызываются. – lins314159

+0

ah true, я не знал, что это реализовано больше, чем WindowListener. Как странно ... видимо, они добавили, что в 1.4. До 1.4, если у Java были аннотации, то, что я сказал, сработало бы :-) (не удаляя ответ, поскольку он действителен как общее правило, а не только в этом конкретном случае) – TofuBeer

3

Не отвечаю на ваш вопрос напрямую (поскольку ответ уже дан), но я предполагаю, что вы хотите выйти из своей программы (или просто скрыть окно) при выходе. Существует более короткое решение для этих ситуаций:

window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
0

Спасибо всем, кто помог мне решить проблему. Я не полностью понимаю это, но следующий код решает проблему:

Frame[] frames = Frame.getFrames(); 
    for(Frame f: frames){ 
     f.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       ExitAction.getInstance().actionPerformed(null); 
      } 

     }); 
    } 

Похоже, что рамка добавляет дополнительные кадры. Спасибо,

1

Просто отладил аналогичную проблему в моей программе Swing. Это оказалось ошибкой Java, которая убивает события пользовательского интерфейса системы, когда ImageIO вызывается до создания пользовательского интерфейса Swing. Смотрите здесь минимальный пример -

https://stackoverflow.com/questions/18964138/osx-specific-new-java-ui-bug-reproducable-java-imageio-close-window-event-bug

Эта ошибка останавливает систему UI события, такие как окно-близко, не доходя до Java.

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