LINUX.ORG.RU

javap javax.swing.JComponent и смотреть его вывод, сравнивая с документацией

Nastishka ★★★★★
()

Приложение на AWT/Swing выполняется в отдельной нити EventDispatchThread. Даже если метод main() основной программы завершился, пока не завершится эта нить (по вызову System.exit()), программа будет работать.

Соответственно, любой вызов стороннего метода из AWT/Swing-компонента происходит синхронно внутри этой нити EventDispatchThread. А чтобы интерфейс не замораживался на время выполнения большого и продолжительного стороннего метода, нужно делать это АСИНХРОННО. Для этого достаточно сделать такой сторонний метод членом отдельного класса Runnable и запускать, соответственно:

		runButton.setText(RUN_LABEL);
		runButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new JobThread().start();
				runButton.setText(WAIT_LABEL);
				runButton.setEnabled(false);
			}
		});

...

	class JobThread extends Thread {
		public void run() {
			try {
				if (currentPanel != null)
					currentPanel.doExecute();
			} finally {
				EventQueue.invokeLater(new Runnable() {
					public void run() {
						runButton.setText(RUN_LABEL);
						runButton.setEnabled(true);
					}
				});
			}
		}
	}
В этом случае программа будет живая.

Ещё.

Заменить стандартную очередь событий собственным вариантом очереди позволяет метод push() класса EventQueue. Ему нужно передать экземпляр вашей очереди событий, унаследованной от класса EventQueue. Наибольший интерес при наследовании представляет метод dispatch Event(), который, как мы знаем, вызывается при распределении событий всех типов. Переопределив данный метод, вы получите исчерпывающую информацию о том, как, когда и какие события распределяются в вашей программе. Это может быть весьма ценно при отладке и диагностике вашей программы или при реализации особого поведения ваших компонентов.

* Портянкин, «Эффектные пользовательские интерфейсы»

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

>> чтобы интерфейс не замораживался на время выполнения большого и продолжительного стороннего метода, нужно делать это АСИНХРОННО

И для этого ещё бывает очень полезен класс SwingWorker.

CARS ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.