如何从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应用程序相关推荐

  1. java gui 控制台_在GUI面板中创建Java控制台

    这是一个功能强大的课程.您可以将此实例安装到系统中并使用以下错误: PrintStream con=new PrintStream(new TextAreaOutputStream(...)); Sy ...

  2. java string 反序列化_无法反序列化VALUE_STRING中的java.util.ArrayList实例

    我有一个使用Jersey构建并部署在AppEngine中的REST服务.REST服务实现使用application/json媒体类型的动词PUT .数据绑定由Jackson进行. 该动词使用JSON中 ...

  3. java静态方法声明_方法本地类中的Java最终静态声明

    在方法内部声明局部内部类时,为什么包含最终的静态String或int是合法的,而包含其他对象却不合法? 例如: class Outer { void aMethod() { class Inner { ...

  4. 什么是jdk的java运行工具_下面( )是 JDK 中的 JAVA 运行工具。

    工作团队名词解释 以下内容属于行政程序合法的是(). 什么是"985工程"和"211工程"? 怎样从盐度结构上对河口进行分类? 柴油机喷油泵的供油拉杆由()控制 ...

  5. java jcombobox长度_如何在JToolBar中设定JComboBox的大小?

    如何在JToolBar中设定JComboBox的大小? 我设计了一个JToolBar,并且在上边添加了一个JComboBox,可是我发现这个JComboBox长度无法控制,它将JToolBar上剩余空 ...

  6. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

    今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...

  7. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

  8. 用控制台怎么编译java程序_怎么在cmd中运行java控制台程序?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2010-08-07  17:00             1,111 SendGift.java 2010-08-09  17:40           ...

  9. java spark 环境_在 IntelliJ IDEA 中配置 Spark(Java API) 运行环境

    1. 新建Maven项目 初始Maven项目完成后,初始的配置(pom.xml)如下: 2. 配置Maven 向项目里新建Spark Core库 xmlns:xsi="http://www. ...

最新文章

  1. gan 总结 数据增强_[NLP]聊一聊,预处理和数据增强技术
  2. Python应用——自定义函数:分割PDF文件函数
  3. Java访问指示符 访问修饰符
  4. 15-CoreData删除所有数据之NSBatchDeleteRequest
  5. Java多线程(十一)之线程池深入分析(上)
  6. [日常] DNS的迭代查询过程
  7. AE物体表面跟踪特效合成高级插件:Lockdown for Mac
  8. TinyMCE下载及使用
  9. spark两种kafka偏移量维护方式
  10. 这月到手的工资多了没?
  11. 淘淘商城19_在taotoa-portal工程中调用taotao-rest工程
  12. 多目标跟踪 综述(三)
  13. 计算机DSU,研科d5000dsu驱动
  14. uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj
  15. Creo5.0 永久修改尺寸单位为毫米(mmns)
  16. HTML+CSS第十课:常见的3种网页布局方式:表格布局、DIV+CSS布局、框架布局
  17. 微信开发(六)微信分享接入
  18. 切换分支报错:Untracked Files Prevent Checkout
  19. 风影ASP.NET基础教学 7用户控件编程
  20. 方方-前端体系课程(二)

热门文章

  1. me shy是什么歌 抖音make_抖音上最火爆的5首英文歌原版!每一首听不腻!都
  2. [蓝桥杯][基础训练]2n皇后问题
  3. cad安装日志文件发生错误_CAD安装时发生错误1603的详细解决方法
  4. 基于java注册登录MD5算法加盐加密颁发 Token身份令牌使用各种邮箱发送验证码详解雪花算法
  5. js效果需要刷新页面才生效
  6. js倒计时原理及实例总结
  7. aapt2资源打包工具
  8. Linux的Web服务器配置
  9. Photoshop滤镜制作精致水晶美女头像
  10. postfix stmp账号被破解,疯狂往外发诈骗邮件