Всплывающее окно Swing в приложении Swing - PullRequest
3 голосов
/ 12 июня 2011

У меня есть Swing UI с определенным количеством кнопок. Одна кнопка вызывает отдельный класс свинга, и открывается новое окно с новыми кнопками и другими функциями. Теперь, когда я закрываю это окно, оригинальное окно также закрывается. Я думаю, что это потому, что оба класса затруднили

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
//some code
}
}

Теперь, как это преодолеть? Пример кода или ссылка будут очень полезны. Спасибо

Ответы [ 4 ]

7 голосов
/ 12 июня 2011

Трудно догадаться, не увидев код. Возможно, для вашего JFrame установлено setDefaultCloseOperation, чтобы закрыть приложение, когда окно закрыто (возможно, EXIT_ON_CLOSE). Посмотрите java doc для получения дополнительной информации об этом.

С Java-документ :

EXIT_ON_CLOSE (определено в JFrame): выйдите из приложения, используя метод System exit. Используйте это только в приложениях.

Это означает, что все приложение закроется. Вы не хотите этого для второго окна. Вы просто хотите закрыть окно (а не приложение).

3 голосов
/ 12 июня 2011

SwingUtilities.invokeLater не имеет отношения к закрытию приложения. Его цель - отложить вызов метода run до того момента, когда поток графического интерфейса завершит рисование и обработку текущих событий.

Я предлагаю вам проверить свой код для EXIT_ON_CLOSE, как уже предлагалось, а также для System.exit() вызовов.

Чтобы ответить на комментарий, поскольку вы устанавливаете EXIT_ON_CLOSE для обоих фреймов, ожидается выход из всего приложения при закрытии любого из фреймов. См. Javadoc .

Чтобы решить вашу проблему, вам нужно удалить это setDefaultCloseOperation на втором кадре.

1 голос
/ 12 июня 2011

Я согласен с другими, вызывая ваш код в главном потоке Swing, EDT или потоке рассылки событий, используя SwingUtilities.invokeLater, который не имеет ничего общего с вашей проблемой, и фактически является хорошей привычкой входить в если есть риск, что, если вы не сделаете этого, ваш код может быть отозван из EDT. Другими словами, если вы показываете другое окно из кода, вызванного в ActionListener JButton, тогда нет необходимости использовать SwingUtilities.invokeLater, так как метод actionPerformed будет вызываться в EDT.

Возвращаясь к вашей проблеме, я предлагаю вам сделать другое окно JDialog - либо модальным для приложения, либо нет, в зависимости от ваших потребностей - а не JFrame. Это позволяет вам держать диалог над основным JFrame и заставлять пользователя работать с вашим диалогом, прежде чем вернуться к основному графическому интерфейсу, и предотвращает закрытие приложения, если диалог закрывается.

И чтобы ответить на ваш вероятный следующий вопрос, да, JDialogs может содержать сложные графические интерфейсы, такие же сложные, как и любой JFrame.

0 голосов
/ 31 декабря 2013

Попробуйте использовать setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) на родительском JFrame.

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) завершит приложение, когда последний JFrame будет закрыт, тогда как EXIT_ON_CLOSE завершит приложение, как только этот JFrame будет закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...