|
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 метод может использоваться, чтобы определить, поддерживается ли определенный статус окна определенным менеджером окон. Пример WindowEventDemo, описанный позже в этом разделе, показывает, как этот метод может использоваться. Слушатели окна обычно используются, чтобы реализовать пользовательское закрывающее окно поведение. Например, слушатель окна используется, чтобы сохранить данные прежде, чем закрыть окно, или выйти из программы, когда последнее окно закрывается.
Пользователь должен не обязательно реализовать слушателя окна, чтобы определить то, что должно сделать окно, когда пользователь закрывает его. По умолчанию, когда пользователь закрывает окно, окно становится невидимым. Чтобы определить различное поведение, используйте setDefaultCloseOperation метод JFrame или JDialog классы. Чтобы реализовать закрывающий окно обработчик, используйте setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE) метод, чтобы позволить слушателю окна обеспечить все закрывающие окно режимы работы. См.
System.exit(int). См., что AWT Распараллеливает Проблемы для получения дополнительной информации. Слушатели окна также обычно используются, чтобы остановить потоки и высвободить средства, когда окно представляется в виде значка, и запустить снова, когда окно является deiconified. Это избегает излишне использовать процессор или другие ресурсы. Например, когда окно, которое содержит анимацию, представляется в виде значка, это должно остановить свой поток анимации и свободный любые большие буферы. Когда окно является deiconified, оно может запустить поток снова и воссоздать буферы.
Следующий пример демонстрирует события окна. Недоступная для редактирования текстовая область сообщает обо всех событиях окна, которые запускаются его окном. Этот демонстрационный пример реализует все методы в WindowListener, WindowFocusListener, и WindowStateListener интерфейсы. Можно найти код демонстрационного примера в

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. Их методы перечисляются в следующих таблицах: | Метод | Цель |
|---|---|
| Вызванный сразу после слушаемого окно показали впервые. | |
Вызванный в ответ на пользователя запрашивают на слушаемый окно быть закрытым. Чтобы фактически закрыть окно, слушатель должен вызвать окно 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 |
â | Демонстрационный пример, который позволяет многократным окнам создаваться и уничтожаться. |