Я читал, что вы не должны .show()
кадры в основном потоке, чтобы избежать взаимоблокировки, это реальная проблема. Всегда ли этого следует избегать? Кроме того, когда вы отображаете любое диалоговое окно, такое как ProgressMonitorInputStream, даже если оно закрывается и выполняется, должны ли вы по-прежнему вызывать System.exit()
, чтобы убить приложение? Как насчет JDialog?
Графические интерфейсы Java, JFrames и диалоги
Ответы (2)
Я читал, что вы не должны использовать кадры .show() в основном потоке, чтобы избежать взаимоблокировки.
Он перестанет читать эту книгу/пост/веб-страницу.
Чтобы ответить на ваш первый вопрос:
Я думаю, что вы можете упустить некоторые моменты.
Весь код пользовательского интерфейса ДОЛЖЕН выполняться в диспетчере событий. Поток (EDT) включает компоненты пользовательского интерфейса, которые еще даже не отображаются на экране.
Вы должны НЕ выполнять трудоемкие задачи во время EDT, так как это предотвратит обновление экрана и сделает ваше приложение неотзывчивым, что пользователи очень и очень ненавидят.
Трудоемкие задачи должны выполняться в собственном потоке (на самом деле это совершенно другая тема), используя что-то вроде SwingWorker или SwingUtilities.invokeLater/andWait для повторной синхронизации/обновления пользовательского интерфейса.
public class BackgroundTask implements Runnable { // extends Thread {
public void run() {
for (int i = 0; i < noQueries; i++) {
runDatabaseQuery(i);
updateProgress(i);
}
}
private void updateProgress(final int queryNo) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
statusLabel.setText("Query: " + queryNo);
}
});
}
}
Чтобы решить ваш второй вопрос:
Да и нет. Класс JFrame
предоставляет defaultCloseOperation, который вы можете использовать для завершения основного приложения.
Однако, если все, что вы когда-либо отображали, это JDialog
или окно другого типа, да, вам нужно будет вызвать System.exit
, чтобы завершить работу JVM.
Там, где это поддерживается, вы можете использовать WindowListener.windowClosed для отслеживания закрытия окна и выполнения соответствующих действий.
Закрытие основного JFrame
в приложении должно вызывать System.exit(); Однако вы можете заставить главное JFrame
закрыть само приложение:
setDefaultCloseOperation(EXIT_ON_CLOSE);
Модальные JDialog
блокируют поток, из которого они вызываются. Однако в этом есть преимущества. Когда вы зависите от ответа пользователя в JDialog
для выполнения действия, вы должны дождаться этого.
setDefaultCloseOperation(EXIT_ON_CLOSE);
Лучше использовать DISPOSE_ON_CLOSE
.
- person Andrew Thompson; 29.08.2012
DISPOSE
. Кстати, приложение должно иметь только один кадр.
- person Andrew Thompson; 30.08.2012
.show()
кадры.. Начиная с 1.5 мы должныsetVisible(true)
. - person Andrew Thompson   schedule 30.08.2012