Java swing закрыть окно через кнопку

Java свинг закрыть окно без выхода из приложения

У меня есть небольшая рамка, где я спрашиваю пользователя и пароль. Этот кадр будет открыт, щелкнув по кнопке в главном окне. Затем у меня есть две кнопки: ok и отмена. Когда я нажимаю кнопку «Отменить», мне нужно закрыть этот кадр, не выходя из приложения. Как я могу это сделать?

8 ответов

Вы можете использовать Frame.hide() или Frame.dispose(). Я также рекомендую посмотреть JDialog или JOptionPane Коррекция: hide() устарела. SetVisible (false) следует использовать вместо

Используйте this.dispose(); в методе прослушивателя действий, когда имя пользователя/пароль будет успешным. например:

public void actionPerformed(ActionEvent ae) < if(ae.getSource()=="button you press to confirm username/password")< if(userNameTf.getText().equals(username)&&isPassword(passwordTf.getPassword()))< new "window to be opened upon success" this.dispose(); // calls dispose on this object ie. // the login window >else < userNameTf.setText(""); passwordTf.setText(""); JOptionPane.showMessageDialog(this, "Username and/or password is incorrect!", "Attention!", JOptionPane.WARNING_MESSAGE); >> > 

Если вы используете внутренние классы для обработки событий просто замените this.dispose() ‘на Super_Class_Name.this.dispose();

Возможно, более чистый способ — это просто изменить setDefaultCloseOperation от EXIT_ON_CLOSE до DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

Вы можете вызвать setVisible (false) в кадре.

Вы также можете вызвать setDefaultCloseOperation в кадре, проходящем в HIDE_ON_CLOSE (информация здесь: http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation%28int%29). Это предотвратит уклонение приложения, если пользователь нажимает «X» на JFrame, чтобы закрыть его.

Метод setVisible не освобождает ресурсы памяти и должен использоваться только тогда, когда форма должна использоваться снова.

Метод dispose Освобождает все ресурсы собственного экрана, используемые этим окном, его подкомпонентами и всеми его дочерними пользователями. То есть ресурсы для этих Компонентов будут уничтожены, любая память, которую они потребляют, будет возвращена ОС, и они будут отмечены как не отображаемые.

Удостоверьтесь, что у вас нет:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Вы можете сделать это разными способами, но эти два способа наиболее удобны в использовании. 1. напишите this.setVisible(false) внутри реализованного ActionListener
Или
2. напишите this.dispose() внутри реализованного ActionListener . Надеюсь, это поможет вам.

Это именно то, что говорит принятый ответ. Нет смысла добавлять ответ, просто чтобы повторить то, что уже принято.

Создайте функцию во внешнем классе, где вы выполняете JFrame (вам нужно закрыть нажатием кнопки отмены).
Напишите this.setVisible(false); в реализации этой функции. Наконец, вызовите эту функцию в реализации ActionListener , когда вы хотите ее закрыть.

Ещё вопросы

  • 0 MVC: результат из JSON Автоматически заполнить представление
  • 0 оставаясь на той же странице, используя заголовок местоположения в php
  • 1 gTTS Python Script в фоновом режиме получает tcgetattr (): неподходящий ioctl для устройства
  • 0 Избыточная загрузка углового модуля на нижнем уровне?
  • 0 Портирование скрипта, который отображает одну запись за раз от perl до php
  • 1 Объекты — Что я делаю не так?
  • 1 ngModel не может правильно определить изменения массива
  • 0 Mvc: вызов метода контроллера и использование значения, выбранного из выпадающего списка в этом методе
  • 0 Laravel Eloquent запрос сборки выберите минимальное значение
  • 1 Возвратите название листовки geoJSON с помощью щелчка
  • 1 Заполните все значения в группе первым ненулевым значением в этой группе
  • 0 Сортировка массива в зависимости от разных значений
  • 1 Булевский DataFrame из серии с самим собой в Pandas
  • 0 Почему я создал потенциальный блуждающий указатель при удалении здесь в деструкторе?
  • 0 Изменить .htaccess на работу? _Escaped_fragment_ = URL
  • 1 Есть ли способ получить URI изображения сразу после его удаления из внешнего хранилища?
  • 1 Отправить строку в веб-сокет Python, используя JavaScript
  • 1 Отделение сервиса ServiceStack от бизнес-логики
  • 0 Ошибка JPA при странном сообщении
  • 0 Слияние сложных массивов
  • 1 Метод, который дал два целых числа, возвращает значение, которое ближе всего к 1000
  • 1 Python 3 — Сокращение списка путем циклического восстановления данного набора
  • 0 PHP заполнить выпадающий список с помощью jquery
  • 0 Исключить ограниченные функции из полученного объекта
  • 1 Как распечатать (или предупредить) значение из магазина ExtJS?
  • 0 Калькулятор чаевых с Jquery
  • 1 Google Sign In в Android получает неверный сертификат отпечатка пальца SHA-1 ошибка
  • 1 Как реализовать обнаружение столкновения полилиний в Javascript
  • 0 Доступ к формату пути, используемому для маршрутизации
  • 1 Куда вставить JScrollPane?
  • 1 Python Pandas, чтение в файле и пропуск строк перед заголовком
  • 0 JQuery добавить / удалить классы по ширине окна
  • 1 Keras: использование mask_zero с дополненными последовательностями по сравнению с одиночной последовательностью без дополнения
  • 1 C # EventViewer Количество EventID
  • 0 Хранить индексы геометрии
  • 0 Как переопределить прослушивание кликов для кнопки в веб-просмотре
  • 0 Проверка Jquery для динамически добавляемых строк с несколькими элементами с одинаковым именем [duplicate]
  • 1 Пытаясь создать код Python для печати электронной почты на веб-сайте с IMAP, localhost не отвечает
  • 1 Ошибка при выходе из окна Jframe
  • 1 FolderBrowserDialog с MVC 4?
  • 0 Данные таблицы HTML смещаются в другие столбцы
  • 1 Отложите HTTP-запросы Node.js, если аналогичная работа уже выполняется
  • 1 MVC 5 использовать сеанс для хранения информации для входа?
  • 0 Функция вызывается, когда пользователь перестает печатать на клавиатуре
  • 1 Проверка кода JavaScript на наличие опечаток в Notepad ++
  • 0 Мобильная версия сайта
  • 0 Данные JSON не загружаются в Angular JS
  • 0 Я хочу отключить кнопку Время входа в систему.
  • 2 Android — Как получить координаты персонажа в текстовом представлении
  • 0 Лучший способ связи между настольным приложением и службой Windows
Читайте также:  Console classes in java

Источник

Как закрыть приложение Java Swing из кода

Каков правильный способ прервать приложение Swing из кода и каковы подводные камни? Я попытался закрыть свое приложение автоматически после срабатывания таймера. Но просто вызов dispose() на JFrame не сделал трюк — окно исчезло, но приложение не закончилось. Однако при закрытии окна с помощью кнопки закрытия приложение завершается. Что мне делать?

9 ответов

Ваше действие закрытия по умолчанию JFrame может быть установлено на » DISPOSE_ON_CLOSE » вместо EXIT_ON_CLOSE (почему люди продолжают использовать EXIT_ON_CLOSE вне меня).

Если у вас есть неизолированные окна или не-демона, ваше приложение не будет завершено. Это следует рассматривать как ошибку (и решить ее с помощью System.exit — очень плохая идея).

Наиболее распространенными виновниками являются java.util.Timer и пользовательский поток, который вы создали. Оба должны быть установлены на демон или должны быть явно убиты.

Если вы хотите проверить все активные фреймы, вы можете использовать Frame.getFrames() . Если все Windows/Frames удалены, используйте отладчик, чтобы проверить какие-либо потоки не-демона, которые все еще запущены.

В моем случае с помощью отладчика я обнаружил, что Swingworker все еще активен. Я вызвал его метод cancel (true) в WindowClose Eventlistener, и теперь программа завершается. Спасибо!

Обратите внимание, что вам, возможно, придется вызывать dispose для каждого кадра, и обычно этого «достаточно» (хотя установка действия закрытия по умолчанию на EXIT_ON_CLOSE, вероятно, тоже неплохая идея).

Что если у вас есть одно окно, открывающее другое, но не выбрасывающее себя, чтобы вы могли использовать его для back окна? Если второе окно затем закрывается и вы используете DISPOSE_ON_CLOSE программа не завершает работу, потому что первое окно все еще «не расположено» . есть ли способ решить эту проблему без использования DISPOSE_ON_CLOSE ?

Читайте также:  Javascript jquery click events

Первое окно должно добавить себя в качестве слушателя второго окна и предпринять соответствующие действия.

Этот ответ предполагает полную противоположность ответу Бизорке. Который правильный? (когда я тестирую с простым приложением, оба, кажется, работают . )

Использование EXIT_ON_CLOSE принудительно завершит работу приложения. Если вам нужно предпринять действия до выхода из программы (например, сохранить рабочие данные), то вам нужно использовать обработчики событий JVM, а не просто использовать обычные обработчики событий Swing. Оба будут «работать», но EXIT_ON_CLOSE вызовет проблемы для более сложных приложений.

Пример в поддержку постепенного выключения: мне нужно было убедиться, что мой блок finally был выполнен, чтобы сетевые подключения были закрыты изящно. Этого не произойдет с вызовом System.exit (EXIT_ON_CLOSE).

2015 и опция по умолчанию (когда ни одна не установлена явно) по-прежнему ‘HIDE_ON_CLOSE’. Просто почему? Утилизация экземпляра — намного лучший вариант поведения по умолчанию .

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

до System.exit(0) лучше, так как вы можете написать Window Listener, чтобы выполнить некоторые операции очистки, прежде чем покинуть приложение.

Этот прослушиватель окон позволяет вам определить:

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."); >

К сожалению, это слишком грубо для меня. Я хочу, чтобы события закрытия окна обрабатывались для некоторых действий по очистке. Хорошо, я мог бы сделать System.exit с SwingUtils.invokeLater, но я бы предпочел сделать все правильно.

System.exit (0) не просто грубый, это зло. Проверьте все кадры, позвоните распоряжаться. Если это не удается, запустите отладчик и посмотрите, какие потоки, не являющиеся демонами, еще живы.

Даже в JDK было много ошибок, которые оставляли процесс без изменений. Так что +1 для выхода (), но вы можете отключить его в отладочных сборках.

Может быть, безопасный способ — это что-то вроде:

 private JButton btnExit; . btnExit = new JButton("Quit"); btnExit.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e)< Container frame = btnExit.getParent(); do frame = frame.getParent(); while (!(frame instanceof JFrame)); ((JFrame) frame).dispose(); >>); 

Следующая программа включает в себя код, который завершит работу программы с отсутствием посторонних потоков без явного вызова System.exit(). Чтобы применить этот пример к приложениям, используя потоки/слушатели/таймеры/и т.д., Нужно только вставлять код очистки, запрашивающий (и, если применимо, ожидающий) их завершение до того, как WindowEvent инициируется вручную в actionPerformed().

Читайте также:  Python datetime delta day

Для тех, кто хочет скопировать/вставить код, способный работать точно так, как показано, в конце включен слегка уродливый, но в противном случае нерелевантный основной метод.

public class CloseExample extends JFrame implements ActionListener < private JButton turnOffButton; private void addStuff() < setDefaultCloseOperation(DISPOSE_ON_CLOSE); turnOffButton = new JButton("Exit"); turnOffButton.addActionListener(this); this.add(turnOffButton); >public void actionPerformed(ActionEvent quitEvent) < /* Iterate through and close all timers, threads, etc here */ this.processWindowEvent( new WindowEvent( this, WindowEvent.WINDOW_CLOSING)); >public CloseExample() < super("Close Me!"); addStuff(); >public static void main(String[] args) < java.awt.EventQueue.invokeLater(new Runnable() < public void run() < CloseExample cTW = new CloseExample(); cTW.setSize(200, 100); cTW.setLocation(300,300); cTW.setVisible(true); >>); > > 

Если вы правильно поняли, что хотите закрыть приложение, даже если пользователь не нажал кнопку закрытия. Вам нужно будет зарегистрировать WindowEvents, возможно, с помощью addWindowListener() или enableEvents() в зависимости от ваших потребностей.

Затем вы можете вызвать событие с вызовом processWindowEvent(). Вот пример кода, который создаст JFrame, подождать 5 секунд и закроет JFrame без взаимодействия с пользователем.

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ClosingFrame extends JFrame implements WindowListener < public ClosingFrame()< super("A Frame"); setSize(400, 400); //in case the user closes the window setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); //enables Window Events on this Component this.addWindowListener(this); //start a timer Thread t = new Timer(); t.start(); >public void windowOpened(WindowEvent e)<> public void windowClosing(WindowEvent e)<> //the event that we are interested in public void windowClosed(WindowEvent e) < System.exit(0); >public void windowIconified(WindowEvent e)<> public void windowDeiconified(WindowEvent e)<> public void windowActivated(WindowEvent e)<> public void windowDeactivated(WindowEvent e)<> //a simple timer class Timer extends Thread < int time = 10; public void run()< while(time-- >0)< System.out.println("Still Waiting:" + time); try< sleep(500); >catch(InterruptedException e)<> > System.out.println("About to close"); //close the frame ClosingFrame.this.processWindowEvent( new WindowEvent( ClosingFrame.this, WindowEvent.WINDOW_CLOSED)); > > //instantiate the Frame public static void main(String args[]) < new ClosingFrame(); >> 

Как вы можете видеть, метод processWindowEvent() заставляет событие WindowClosed запускаться, когда у вас есть возможность сделать некоторый очищающий код, если вам нужно до закрытия приложения.

Начиная с JDK 1.4 приложение завершается, если:

  • Нет отображаемых компонентов AWT или Swing.
  • В собственной очереди событий нет встроенных событий.
  • В java EventQueues нет событий AWT.

В документе указано, что некоторые пакеты создают отображаемые компоненты, не отпуская их. Программа, которая вызывает Toolkit.getDefaultToolkit(), не будет завершена. среди прочих, приведенных в качестве примера.

Кроме того, другие процессы могут сохранять AWT в живых, когда они по какой-либо причине отправляют события в очередь собственных событий.

Также я заметил, что на некоторых системах он занимает несколько секунд до того, как приложение фактически завершится.

В ответ на другие комментарии DISPOSE_ON_CLOSE, похоже, не корректно выходит из приложения — он только уничтожает окно, но приложение будет продолжать работать. Если вы хотите прервать использование приложения EXIT_ON_CLOSE.

Этот ответ предполагает полную противоположность ответа Джеймса Шека. Который правильный? (когда я тестирую с простым приложением, оба, кажется, работают . )

Источник

Оцените статью