java swing 退出程序_如何从cod中关闭Java Swing应用程序
如何从cod中关闭Java Swing应用程序
从代码中终止Swing应用程序的正确方法是什么,有哪些陷阱?
我试图在计时器启动后自动关闭我的应用程序。 但是只是在JFrame上拨打dispose()并没有做到这一点 - 窗口消失但应用程序没有终止。 但是,当使用关闭按钮关闭窗口时,应用程序会终止。 我该怎么办?
hstoerr asked 2019-08-25T21:22:22Z
9个解决方案
102 votes
您的JFrame默认关闭操作可以设置为" DISPOSE_ON_CLOSE" 而不是Frame.getFrames()(为什么人们继续使用EXIT_ON_CLOSE超出我的意义)。
如果您有任何未曝光的窗口或非守护程序线程,您的应用程序将不会终止。 这应该被认为是一个错误(并使用System.exit解决它是一个非常糟糕的主意)。
最常见的罪魁祸首是java.util.Timer和你创建的自定义线程。 两者都应该设置为守护进程或必须被明确杀死。
如果要检查所有活动帧,可以使用Frame.getFrames().如果处理掉所有Windows /帧,则使用调试器检查仍在运行的任何非守护程序线程。
James Schek answered 2019-08-25T21:22:56Z
34 votes
我想一个EXIT_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.");
}
VonC answered 2019-08-25T21:23:35Z
14 votes
尝试:
System.exit(0);
原油,但有效。
Daniel Spiewak answered 2019-08-25T21:24:02Z
11 votes
可能是安全的方式是这样的:
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();
}
});
Kachwahed answered 2019-08-25T21:24:27Z
9 votes
以下程序包括将在没有显式调用System.exit()的情况下终止缺少无关线程的程序的代码。 为了将此示例应用于使用线程/侦听器/定时器/等的应用程序,在actionPerformed()中手动启动WindowEvent之前,只需要插入清除代码请求(以及,如果适用,等待)它们的终止。
对于那些希望复制/粘贴能够完全按照所示运行的代码的人来说,最后会包含一个稍微丑陋但不相关的主要方法。
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);
}
});
}
}
Eric Sadler answered 2019-08-25T21:25:00Z
4 votes
如果我理解正确,即使用户没有点击关闭按钮,也要关闭应用程序。 您可能需要使用addWindowListener()或enableEvents()注册WindowEvents,以更好地满足您的需求。
然后,您可以通过调用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事件,如果您在关闭应用程序之前需要执行某些清理代码,则会触发该事件。
Vincent Ramdhanie answered 2019-08-25T21:25:40Z
2 votes
查看Oracle文档。
从JDK 1.4开始,应用程序在以下情况下终止:
没有可显示的AWT或Swing组件。
本机事件队列中没有本机事件。
java EventQueues中没有AWT事件。
Cornercases:
该文档声明某些包创建可显示的组件而不释放它们。调用Toolkit.getDefaultToolkit()的程序不会终止。 是作为一个例子给出的。
当其他原因将其发送到本机事件队列时,其他进程也可以使AWT保持活动状态。
另外我注意到在某些系统上,在应用程序实际终止之前需要几秒钟。
Reiner Lange answered 2019-08-25T21:27:02Z
0 votes
我认为,这个想法就在这里WindowListener - 你可以添加任何你希望在事情关闭之前运行的代码
Tamas Rev answered 2019-08-25T21:27:27Z
0 votes
为了响应其他注释,DISPOSE_ON_CLOSE似乎没有正确退出应用程序 - 它只会破坏窗口,但应用程序将继续运行。 如果要终止应用程序,请使用EXIT_ON_CLOSE。
JSideris answered 2019-08-25T21:27:52Z
java swing 退出程序_如何从cod中关闭Java Swing应用程序相关推荐
- java gui 控制台_在GUI面板中创建Java控制台
这是一个功能强大的课程.您可以将此实例安装到系统中并使用以下错误: PrintStream con=new PrintStream(new TextAreaOutputStream(...)); Sy ...
- java string 反序列化_无法反序列化VALUE_STRING中的java.util.ArrayList实例
我有一个使用Jersey构建并部署在AppEngine中的REST服务.REST服务实现使用application/json媒体类型的动词PUT .数据绑定由Jackson进行. 该动词使用JSON中 ...
- java静态方法声明_方法本地类中的Java最终静态声明
在方法内部声明局部内部类时,为什么包含最终的静态String或int是合法的,而包含其他对象却不合法? 例如: class Outer { void aMethod() { class Inner { ...
- 什么是jdk的java运行工具_下面( )是 JDK 中的 JAVA 运行工具。
工作团队名词解释 以下内容属于行政程序合法的是(). 什么是"985工程"和"211工程"? 怎样从盐度结构上对河口进行分类? 柴油机喷油泵的供油拉杆由()控制 ...
- java jcombobox长度_如何在JToolBar中设定JComboBox的大小?
如何在JToolBar中设定JComboBox的大小? 我设计了一个JToolBar,并且在上边添加了一个JComboBox,可是我发现这个JComboBox长度无法控制,它将JToolBar上剩余空 ...
- amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境
今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...
- 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!
1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...
- 用控制台怎么编译java程序_怎么在cmd中运行java控制台程序?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2010-08-07 17:00 1,111 SendGift.java 2010-08-09 17:40 ...
- java spark 环境_在 IntelliJ IDEA 中配置 Spark(Java API) 运行环境
1. 新建Maven项目 初始Maven项目完成后,初始的配置(pom.xml)如下: 2. 配置Maven 向项目里新建Spark Core库 xmlns:xsi="http://www. ...
最新文章
- gan 总结 数据增强_[NLP]聊一聊,预处理和数据增强技术
- Python应用——自定义函数:分割PDF文件函数
- Java访问指示符 访问修饰符
- 15-CoreData删除所有数据之NSBatchDeleteRequest
- Java多线程(十一)之线程池深入分析(上)
- [日常] DNS的迭代查询过程
- AE物体表面跟踪特效合成高级插件:Lockdown for Mac
- TinyMCE下载及使用
- spark两种kafka偏移量维护方式
- 这月到手的工资多了没?
- 淘淘商城19_在taotoa-portal工程中调用taotao-rest工程
- 多目标跟踪 综述(三)
- 计算机DSU,研科d5000dsu驱动
- uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj
- Creo5.0 永久修改尺寸单位为毫米(mmns)
- HTML+CSS第十课:常见的3种网页布局方式:表格布局、DIV+CSS布局、框架布局
- 微信开发(六)微信分享接入
- 切换分支报错:Untracked Files Prevent Checkout
- 风影ASP.NET基础教学 7用户控件编程
- 方方-前端体系课程(二)