如何以编程方式closuresJFrame

获取JFrameclosures的正确方法是什么?就像用户点击Xclosuresbutton一样,或者按下Alt + F4 (在Windows上)?

我有我的默认closures操作设置我想要的方式,通过:

 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

它正是我想要的上述控制。 这个问题不是这个。

我真正想要做的是导致GUI的行为方式与Xclosuresbutton的按下会导致它的行为一样。

假设我要扩展WindowAdaptor ,然后通过addWindowListener()适配器的一个实例添加为侦听器。 我想通过windowDeactivated()windowClosing()windowClosed()看到与Xclosuresbutton相同的调用序列。 可以这么说,没有那么多的把窗户撕掉的事情。

如果您希望GUI的行为与您单击Xclosuresbutton一样,那么您需要将窗口closures事件发送到Window 。 closures应用程序的ExitAction允许您将此function添加到菜单项或任何使用Action的组件中。

 frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); 
 setVisible(false); //you can't see me! dispose(); //Destroy the JFrame object 

不太棘手。

如果通过Alt-F4或X表示“立即退出应用程序而不考虑其他Windows或线程正在运行”,那么System.exit(...)将以非常突然,暴力的方式完成您想要的任务,并可能有问题的时尚。

如果按Alt-F4或X表示隐藏窗口,那么frame.setVisible(false)就是如何“closures”窗口。 该窗口将继续消耗资源/内存,但可以很快再次显示。

如果按Alt-F4或X的意思是隐藏窗口并处理它消耗的所有资源,那么frame.dispose()就是你如何“closures”窗口。 如果该框架是最后一个可见窗口,并且没有其他非守护进程正在运行,程序将退出。 如果再次显示窗口,则必须重新初始化所有本地资源(graphics缓冲区,窗口句柄等)。

dispose()可能最接近你真正想要的行为。 如果你的应用程序有多个窗口打开,你想要Alt-F4或X退出应用程序或只是closures活动窗口?

关于Window Listeners的Java Swing教程可能会帮助您澄清事情。

如果你已经这样做了,以确保用户不能closures窗口:

 frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

那么你应该改变你的pullThePlug()方法

 public void pullThePlug() { // this will make sure WindowListener.windowClosing() et al. will be called. WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev); // this will hide and dispose the frame, so that the application quits by // itself if there is nothing else around. setVisible(false); dispose(); // if you have other similar frames around, you should dispose them, too. // finally, call this to really exit. // i/o libraries such as WiiRemoteJ need this. // also, this is what swing does for JFrame.EXIT_ON_CLOSE System.exit(0); } 

我发现这是与WindowListenerJFrame.DO_NOTHING_ON_CLOSE配合使用的唯一方法。

不仅要closuresJFrame,还要触发WindowListener事件,试试这个:

 myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING)); 

从Java运行过程中退出是非常容易的,基本上你只需要做两件简单的事情:

  1. 在应用程序的退出点调用java方法System.exit(…)。 例如,如果您的应用程序是基于框架的,则可以添加侦听器WindowAdapter,并在其方法windowClosing(WindowEvent e)内调用System.exit(…)。

注意:你必须调用System.exit(…),否则你的程序是错误的。

  1. 避免意外的javaexception,确保可以始终调用exit方法。 如果在正确的位置添加System.exit(…),但这并不意味着可以始终调用该方法,因为意外的javaexception可能会阻止该方法被调用。

这与你的编程技巧密切相关。

**下面是一个最简单的示例(基于JFrame),它显示了如何调用exit方法

 import java.awt.event.*; import javax.swing.*; public class ExitApp extends JFrame { public ExitApp() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); //calling the method is a must } }); } public static void main(String[] args) { ExitApp app=new ExitApp(); app.setBounds(133,100,532,400); app.setVisible(true); } } 

以编程方式closuresSwing框架的最佳方法是使其按下“X”button时的行为。 为此,您将需要实现适合您的需求的WindowAdapter,并设置框架的默认closures操作(DO_NOTHING_ON_CLOSE)。

像这样初始化你的框架:

 private WindowAdapter windowAdapter = null; private void initFrame() { this.windowAdapter = new WindowAdapter() { // WINDOW_CLOSING event handler @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); // You can still stop closing if you want to int res = JOptionPane.showConfirmDialog(ClosableFrame.this, "Are you sure you want to close?", "Close?", JOptionPane.YES_NO_OPTION); if ( res == 0 ) { // dispose method issues the WINDOW_CLOSED event ClosableFrame.this.dispose(); } } // WINDOW_CLOSED event handler @Override public void windowClosed(WindowEvent e) { super.windowClosed(e); // Close application if you want to with System.exit(0) // but don't forget to dispose of all resources // like child frames, threads, ... // System.exit(0); } }; // when you press "X" the WINDOW_CLOSING event is called but that is it // nothing else happens this.setDefaultCloseOperation(ClosableFrame.DO_NOTHING_ON_CLOSE); // don't forget this this.addWindowListener(this.windowAdapter); } 

您可以通过发送WINDOW_CLOSING事件来以编程方式closures框架,如下所示:

 WindowEvent closingEvent = new WindowEvent(targetFrame, WindowEvent.WINDOW_CLOSING); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent); 

这将按下“X”buttonclosures框架。

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

不仅closuresJFrame,而且closures整个应用程序,因此“退出closures”

为了达到相同的结果,你必须有效地退出应用程序,只需调用

  System.exit(0); 

效果完全一样。

这个例子显示了如何实现确认的窗口closures操作。

该窗口有一个窗口适配器,根据您在OptionDialog的回答,将默认closures操作切换为EXIT_ON_CLOSEOptionDialog

ConfirmedCloseWindow closeWindow方法触发closures窗口事件,可以在任何地方使用,即作为菜单项的动作

 public class WindowConfirmedCloseAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) { Object options[] = {"Yes", "No"}; int close = JOptionPane.showOptionDialog(e.getComponent(), "Really want to close this application?\n", "Attention", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, null); if(close == JOptionPane.YES_OPTION) { ((JFrame)e.getSource()).setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } else { ((JFrame)e.getSource()).setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE); } } } public class ConfirmedCloseWindow extends JFrame { public ConfirmedCloseWindow() { addWindowListener(new WindowConfirmedCloseAdapter()); } private void closeWindow() { processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); } } 

如果您真的不希望您的应用程序在JFrameclosures时终止,

使用: setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

而不是: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

以下是解决scheme的简介,

  myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING)); 

这里是你的select:

 System.exit(0); // stop program frame.dispose(); // close window frame.setVisible(false); // hide window 

您必须将调用插入到AWT消息队列中,以便所有计时都能正确进行,否则将不会调度正确的事件序列,特别是在multithreading程序中。 完成此操作后,可以完全按照用户点击支持操作系统的装饰JFrame的[x]button的方式来处理结果事件序列。

 public void closeWindow() { if(awtWindow_ != null) { EventQueue.invokeLater(new Runnable() { public void run() { awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING)); } }); } } 

基于这里已经提供的答案,这是我实现它的方式:

 JFrame frame= new JFrame() frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame stuffs here ... frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); 

JFrame获取事件closures和closures,退出。

这个答案是由Alex给出的,我想推荐它。 它为我工作,另一件事情简单明了。

 setVisible(false); //you can't see me! dispose(); //Destroy the JFrame object 

张贴在问题的身体是CW回答。

想要分享的结果,主要源于跟随camickr的联系。 基本上我需要在应用程序的事件队列中抛出一个WindowEvent.WINDOW_CLOSING 。 以下是解决scheme的简介

 // closing down the window makes sense as a method, so here are // the salient parts of what happens with the JFrame extending class .. public class FooWindow extends JFrame { public FooWindow() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(5, 5, 400, 300); // yeah yeah, this is an example ;P setVisible(true); } public void pullThePlug() { WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev); } } // Here's how that would be employed from elsewhere - // someplace the window gets created .. FooWindow fooey = new FooWindow(); ... // and someplace else, you can close it thusly fooey.pullThePlug(); 

如果您不希望应用程序在JFrameclosures时终止,请使用:setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)

而不是:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

从文档:

DO_NOTHING_ON_CLOSE (defined in WindowConstants) :不要做任何事情; 要求程序在注册的WindowListener对象的windowClosing方法中处理操作。

HIDE_ON_CLOSE (defined in WindowConstants) :在调用任何已注册的WindowListener对象后自动隐藏框架。

DISPOSE_ON_CLOSE (defined in WindowConstants) :在调用任何已注册的WindowListener对象后,自动隐藏并处理该帧。

EXIT_ON_CLOSE (defined in JFrame) :使用System exit方法退出应用程序。 仅在应用程序中使用这个。

可能仍然有用:如果您想要再次显示相同的框架,则可以在JFrame上使用setVisible(false) 。 否则,调用dispose()来删除所有的本地屏幕资源。

从彼得郎复制

https://stackoverflow.com/a/1944474/3782247

我已经尝试过,编写formWindowClosing()事件你自己的代码。

  private void formWindowClosing(java.awt.event.WindowEvent evt) { int selectedOption = JOptionPane.showConfirmDialog(null, "Do you want to exit?", "FrameToClose", JOptionPane.YES_NO_OPTION); if (selectedOption == JOptionPane.YES_OPTION) { setVisible(false); dispose(); } else { setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); } } 

这询问用户他是否要退出框架或应用程序。

  setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);