如何以编程方式closuresJFrame
获取JFrame
closures的正确方法是什么?就像用户点击X
closuresbutton一样,或者按下Alt + F4 (在Windows上)?
我有我的默认closures操作设置我想要的方式,通过:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
它正是我想要的上述控制。 这个问题不是这个。
我真正想要做的是导致GUI的行为方式与X
closuresbutton的按下会导致它的行为一样。
假设我要扩展WindowAdaptor
,然后通过addWindowListener()
适配器的一个实例添加为侦听器。 我想通过windowDeactivated()
, windowClosing()
和windowClosed()
看到与X
closuresbutton相同的调用序列。 可以这么说,没有那么多的把窗户撕掉的事情。
如果您希望GUI的行为与您单击X
closuresbutton一样,那么您需要将窗口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); }
我发现这是与WindowListener
和JFrame.DO_NOTHING_ON_CLOSE
配合使用的唯一方法。
不仅要closuresJFrame,还要触发WindowListener事件,试试这个:
myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));
从Java运行过程中退出是非常容易的,基本上你只需要做两件简单的事情:
- 在应用程序的退出点调用java方法System.exit(…)。 例如,如果您的应用程序是基于框架的,则可以添加侦听器WindowAdapter,并在其方法windowClosing(WindowEvent e)内调用System.exit(…)。
注意:你必须调用System.exit(…),否则你的程序是错误的。
- 避免意外的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_CLOSE
或OptionDialog
。
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()
来删除所有的本地屏幕资源。
从彼得郎复制
我已经尝试过,编写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);