Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел объясняет, как реализовать три вида связанных с окном обработчиков событий: WindowListener
, WindowFocusListener
, и WindowStateListener
. Все три слушателя обрабатывают WindowEvent
объекты. Методы во всех трех обработчиках событий реализуются кратким обзором WindowAdapter
class.
Когда соответствующий слушатель был зарегистрирован на окне (таком как фрейм или диалоговое окно), события окна запускаются сразу после действия окна или состояния произошел. Окно рассматривают как "владельца фокуса", если это окно получает ввод с клавиатуры.
Следующие действия окна или состояния могут предшествовать событию окна:
WindowListener
интерфейс определяет методы, которые обрабатывают большинство событий окна, таких как события для открытия и закрыть окно, активацию и дезактивацию окна, и iconification и deiconification окна.
Другие два слушателя окна взаимодействуют через интерфейс, WindowFocusListener
и WindowStateListener
, были представлены в выпуске 1.4 JDK. WindowFocusListener
содержит методы, чтобы обнаружить, когда окно становится владельцем фокуса, или оно теряет состояние владельца фокуса. WindowStateListener
имеет единственный метод, чтобы обнаружить изменение к состоянию окна, такой как тогда, когда окно представляется в виде значка, deiconified, максимизируется, или восстанавливается нормальному.
WindowListener
методы windowActivated
и windowDeactivated
. Этот подход не работал с окнами, которые не были фреймами или диалоговыми окнами, потому что такие окна, никогда получаемые те события. Определить iconification окна, ComponentListener
методы componentHidden
и componentShown
использовались. С выпуска 1.4 JDK, методы, определенные в WindowFocusListener
и WindowStateListener
предпочитаются. В то время как можно использовать WindowListener
методы, чтобы обнаружить некоторые состояния окна, такие как iconification, есть две причины почему a WindowStateListener
могло бы быть предпочтительным: у этого есть только один метод для Вас, чтобы реализовать, и это оказывает поддержку для максимизации.
java.awt.Toolkit
метод isFrameStateSupported(int)
Слушатели окна обычно используются, чтобы реализовать пользовательское закрывающее окно поведение. Например, слушатель окна используется, чтобы сохранить данные прежде, чем закрыть окно, или выйти из программы, когда последнее окно закрывается.
Пользователь должен не обязательно реализовать слушателя окна, чтобы определить то, что должно сделать окно, когда пользователь закрывает его. По умолчанию, когда пользователь закрывает окно, окно становится невидимым. Чтобы определить различное поведение, используйте setDefaultCloseOperation
метод JFrame
или JDialog
классы. Чтобы реализовать закрывающий окно обработчик, используйте setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
метод, чтобы позволить слушателю окна обеспечить все закрывающие окно режимы работы. См. setDefaultCloseOperation
.
System.exit(int)
. См., что AWT Распараллеливает Проблемы для получения дополнительной информации. Слушатели окна также обычно используются, чтобы остановить потоки и высвободить средства, когда окно представляется в виде значка, и запустить снова, когда окно является deiconified. Это избегает излишне использовать процессор или другие ресурсы. Например, когда окно, которое содержит анимацию, представляется в виде значка, это должно остановить свой поток анимации и свободный любые большие буферы. Когда окно является deiconified, оно может запустить поток снова и воссоздать буферы.
Следующий пример демонстрирует события окна. Недоступная для редактирования текстовая область сообщает обо всех событиях окна, которые запускаются его окном. Этот демонстрационный пример реализует все методы в WindowListener
, WindowFocusListener
, и WindowStateListener
интерфейсы. Можно найти код демонстрационного примера в WindowEventDemo.java
.
windowStateChanged
метод в WindowStateListener
class дает ту же самую информацию, что Вы получаете использование windowIconified
и windowDeiconified
методы в WindowListener
class. Активация окна и события "окно полученный фокус" также сообщаются.Вот код обработки событий окна демонстрационного примера:
public class WindowEventDemo extends JFrame implements WindowListener, WindowFocusListener, WindowStateListener { ... static WindowEventDemo frame = new WindowEventDemo("WindowEventDemo"); JTextArea display; ... private void addComponentsToPane() { display = new JTextArea(); display.setEditable(false); JScrollPane scrollPane = new JScrollPane(display); scrollPane.setPreferredSize(new Dimension(500, 450)); getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(this); addWindowFocusListener(this); addWindowStateListener(this); checkWM(); } public WindowEventDemo(String name) { super(name); } //Some window managers don't support all window states. public void checkWM() { Toolkit tk = frame.getToolkit(); if (!(tk.isFrameStateSupported(Frame.ICONIFIED))) { displayMessage( "Your window manager doesn't support ICONIFIED."); } else displayMessage( "Your window manager supports ICONIFIED."); if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_VERT))) { displayMessage( "Your window manager doesn't support MAXIMIZED_VERT."); } else displayMessage( "Your window manager supports MAXIMIZED_VERT."); if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_HORIZ))) { displayMessage( "Your window manager doesn't support MAXIMIZED_HORIZ."); } else displayMessage( "Your window manager supports MAXIMIZED_HORIZ."); if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_BOTH))) { displayMessage( "Your window manager doesn't support MAXIMIZED_BOTH."); } else { displayMessage( "Your window manager supports MAXIMIZED_BOTH."); } } public void windowClosing(WindowEvent e) { displayMessage("WindowListener method called: windowClosing."); //A pause so user can see the message before //the window actually closes. ActionListener task = new ActionListener() { boolean alreadyDisposed = false; public void actionPerformed(ActionEvent e) { if (frame.isDisplayable()) { alreadyDisposed = true; frame.dispose(); } } }; Timer timer = new Timer(500, task); //fire every half second timer.setInitialDelay(2000); //first delay 2 seconds timer.setRepeats(false); timer.start(); } public void windowClosed(WindowEvent e) { //This will only be seen on standard output. displayMessage("WindowListener method called: windowClosed."); } public void windowOpened(WindowEvent e) { displayMessage("WindowListener method called: windowOpened."); } public void windowIconified(WindowEvent e) { displayMessage("WindowListener method called: windowIconified."); } public void windowDeiconified(WindowEvent e) { displayMessage("WindowListener method called: windowDeiconified."); } public void windowActivated(WindowEvent e) { displayMessage("WindowListener method called: windowActivated."); } public void windowDeactivated(WindowEvent e) { displayMessage("WindowListener method called: windowDeactivated."); } public void windowGainedFocus(WindowEvent e) { displayMessage("WindowFocusListener method called: windowGainedFocus."); } public void windowLostFocus(WindowEvent e) { displayMessage("WindowFocusListener method called: windowLostFocus."); } public void windowStateChanged(WindowEvent e) { displayStateMessage( "WindowStateListener method called: windowStateChanged.", e); } void displayMessage(String msg) { display.append(msg + newline); System.out.println(msg); } void displayStateMessage(String prefix, WindowEvent e) { int state = e.getNewState(); int oldState = e.getOldState(); String msg = prefix + newline + space + "New state: " + convertStateToString(state) + newline + space + "Old state: " + convertStateToString(oldState); displayMessage(msg); } String convertStateToString(int state) { if (state == Frame.NORMAL) { return "NORMAL"; } String strState = " "; if ((state & Frame.ICONIFIED) != 0) { strState += "ICONIFIED"; } //MAXIMIZED_BOTH is a concatenation of two bits, so //we need to test for an exact match. if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) { strState += "MAXIMIZED_BOTH"; } else { if ((state & Frame.MAXIMIZED_VERT) != 0) { strState += "MAXIMIZED_VERT"; } if ((state & Frame.MAXIMIZED_HORIZ) != 0) { strState += "MAXIMIZED_HORIZ"; } if (" ".equals(strState)){ strState = "UNKNOWN"; } } return strState.trim(); } }
WindowEvent
class. Их методы перечисляются в следующих таблицах: WindowAdapter
Метод | Цель |
---|---|
|
Вызванный сразу после слушаемого окно показали впервые. |
|
Вызванный в ответ на пользователя запрашивают на слушаемый окно быть закрытым. Чтобы фактически закрыть окно, слушатель должен вызвать окно dispose или setVisible(false) метод. |
|
Вызванный сразу после слушаемого окно закрылось. |
|
Вызванный сразу после слушаемого окно представляется в виде значка или deiconified, соответственно. |
|
Вызванный сразу после слушаемого окно активировано или деактивировано, соответственно. Эти методы не отправляются окнам, которые не являются фреймами или диалоговыми окнами. Поэтому мы предпочитаем 1.4 windowGainedFocus и windowLostFocus методы, чтобы определить, когда окно получает или теряет фокус. |
Метод | Цель |
---|---|
|
Вызванный сразу после слушаемого окно получает или теряет фокус, соответственно. |
Метод | Цель |
---|---|
|
Вызванный сразу после слушаемого состояние окна изменяется, будучи представленным в виде значка, deiconified, максимизируется, или возвращается к нормальному. Состояние доступно через WindowEvent как поразрядная маска. Возможные значения, определенные в java.awt.Frame :
|
Метод | Цель |
---|---|
|
Возвращает окно, которое запустило событие. Можно использовать это вместо getSource метод. |
|
Возвращает другое окно, включенное в этот фокус или изменение активации. Для a WINDOW_ACTIVATED или WINDOW_GAINED_FOCUS событие, это возвращает окно, которое потеряло активацию или фокус. Для a WINDOW_DEACTIVATED или WINDOW_LOST_FOCUS событие, это возвращает окно, которое получало активацию или фокус. Для любого другого типа WindowEvent с приложением Java в различном VM или контексте, или без другого окна, null возвращается. Этот метод был представлен в выпуске 1.4 JDK. |
|
Для WINDOW_STATE_CHANGED события, эти методы возвращают предыдущее или новое состояние окна как поразрядная маска. Эти методы были представлены в выпуске 1.4 JDK. |
Пример | Где Описано | Примечания |
---|---|---|
WindowEventDemo |
Этот раздел | Отчеты все события окна, которые происходят на одном окне, чтобы демонстрировать обстоятельства, при которых запускаются события окна. |
SliderDemo |
|
Прислушивается к окну, представляют в виде значка и deiconify события, так, чтобы оно могло остановить анимацию, когда окно не видимо. |
InternalFrameEventDemo |
Как Записать Слушателю Внутренней рамки | Отчеты все события внутренней рамки, которые происходят на одной внутренней рамке, чтобы демонстрировать обстоятельства, при которых запускаются события внутренней рамки. События внутренней рамки подобны событиям окна. |
DialogDemo |
Текстовые Компонентные Функции |
CustomDialog.java использование setDefaultCloseOperation вместо слушателя окна, чтобы определить, что действие взять, когда пользователь закрывает окно. |
Framework |
â | Демонстрационный пример, который позволяет многократным окнам создаваться и уничтожаться. |