当前页面: 开发资料首页 → J2SE 专题 → JFrame确认关闭窗口的问题
JFrame确认关闭窗口的问题
摘要: JFrame确认关闭窗口的问题
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class comFrame extends JFrame implements WindowListener
{
comFrame()
{
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension d=kit.getScreenSize();
this.setSize((int)d.getWidth()/2,(int)d.getHeight()/2);
this.setLocation((int)d.getWidth()/4,(int)d.getHeight()/4);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addWindowListener(this);
this.setVisible(true);
}
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e)
{
int option= JOptionPane.showConfirmDialog(
this,-#34;确定退出系统?-#34;,-#34;提示-#34;,JOptionPane.YES_NO_CANCEL_OPTION);
if(option==JOptionPane.YES_OPTION)
if(e.getWindow() == this)
{
System.exit(0);
}
else
{
return;
}
}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public static void main(String[] args)
{
comFrame aFrame=new comFrame();
}
}
在按下frame(只有一个frame)的关闭键后我想弹出一个确认用的JOptionPane如果选择否,则不退出应该怎么做(不关闭该frame)。但以上代码在SDK1.5中测试,收到cancle和no的消息后,frame仍旧关闭,但是系统中仍存在一个多出来的javaw.exe进程。不知哪里有错。请教
public void windowClosing(WindowEvent e)
{
int option= JOptionPane.showConfirmDialog(
this,-#34;确定退出系统?-#34;,-#34;提示-#34;,JOptionPane.YES_NO_CANCEL_OPTION);
if(option==JOptionPane.YES_OPTION)
if(e.getWindow() == this)
{
System.exit(0);
}
else
{
return;
}
}
这个里面有问题,如果你把所有的都屏蔽掉:
public void windowClosing(WindowEvent e)
{
return;
}
仍然可以推出窗口。。。。
建议你这样做:
public void windowClosing(WindowEvent e)
{
int option= JOptionPane.showConfirmDialog(
this,-#34;确定退出系统?-#34;,-#34;提示-#34;,JOptionPane.YES_NO_CANCEL_OPTION);
if(option==JOptionPane.YES_OPTION)
if(e.getWindow() == this)
{
System.exit(0);
}
else
{
new comFrame();
}
}
困惑ing
关注
不会是1.5的问题吧?
...迷惑中
因为这个comFrame我想将其作为一个模板类,即每次利用extends继承这个内中的窗口设置大小和定位的工作,衍生出来的子类用来作为真正的frame类。
如
class mainFrame extends comFrame
{
}
如果这样的话重新生成的将只是
因为这个comFrame我想将其作为一个模板类,即每次利用extends继承这个内中的窗口设置大小和定位的工作,衍生出来的子类用来作为真正的frame类。
如
class mainFrame extends comFrame
{
mainFrame()
{
this.add(new JButton(-#34;newButton-#34;));
}
}
如果这样的话重新生成的将只是重新生成了comFrame,而没有起到返回一个mainFrame的作用,如果每次修改comFrame中得new xxxFrame()的话重用机制就不太好,请教是否还有其他方法。
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test extends JPanel {
private JFrame frame = null;
public Test() {
frame = new JFrame(-#34;Test-#34;);
frame.getContentPane().add(this);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int option = JOptionPane.showConfirmDialog(null,-#34;是否完全退出该系统?-#34;,-#34;系统提示-#34;,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if (option == JOptionPane.YES_OPTION)
System.exit(0);
}
});
frame.setSize(300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
new Test();
}
}
已试,已解决
我对JFrame.setDefaultCloseOperation();用下面的这段代码试了一下,在主窗体(mainFrame)中控制一个JFrame窗体(aFrame),当aFrame关闭后,用mainFrame中得btnShow调用aFrame的setVisible方法可以将aFrame显示出来,那么JFrame中得默认setCloseOperation应该是CloseOnHide。
但是我在mainFrame中的closing事件中加入了setVisible(true); 按照上面的推想,这时mainFrame应该还会显示,但是实际运行时mainFrame仍旧关闭,而且在进程中运行该程序的javaw.exe存在。还想多问一下setDefaultCloseOperation()得默认只是什么,进程中那个javaw.exe是指的该程序吗?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;
public class frameTest extends JFrame
{
JFrame testFrame;
frameTest(JFrame frameRef)
{
super();
testFrame=frameRef;
JButton btnShow=new JButton(-#34;show-#34;);
btnShow.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
testFrame.setVisible(true);
}
});
this.add(btnShow);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
frameTest.this.setVisible(true);
//e.getWindow().setVisible(true);
}
});
this.setSize(200,200);
this.setVisible(true);
}
public static void main(String[] args)
{
JFrame aFrame=new JFrame(-#34;frameRef-#34;);
frameTest frame1=new frameTest(aFrame);
aFrame.setSize(100,100);
aFrame.setVisible(true);
}
}
来迟了,收藏
关之前,如果窗口移动了位置,那么等我按取消关闭的时候岂不重新定位了一下,效果不好:)
如果在关之前,把当前窗口位置记住,然后要是取消关闭,就把位置移到刚才记下的哪个位置的话应该更好吧,多嘴了
结帖吧!
谢了,结帖。
此贴结早已
好像整个CSDN只有一条是问如何阻止JFrame关闭的问题. 并且答案也不是很正确!
上面的答案并不能捕获窗体的关闭事件,只是在关闭时得到通知。
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter(){
....windowClosing(....){
//这样的做法并不能捕获这个frame的关闭事件
//只是在关闭时得到了通知
}
});
正确的做法是
class MyFrame extends JFrame{
MyFrame(){
try{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
}
catch(Exception e){}
}
protected void processWindowEvent(WindowEvent e) {
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
//处理Jframe关闭事件
//你是否要关闭吗?
//是:super.processWindowEvent(e)否则return;
}else{
//忽略其他事件,交给JFrame处理
super.processWindowEvent(e);
}
}
}
protected void processWindowEvent(WindowEvent e) {
boolean enable = false;
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
//处理Jframe关闭事件
int option= JOptionPane.showConfirmDialog(
this,-#34;确定退出系统?/n如果已经开局,则不管退出或者断线,服务器都会认为投注有效?-#34;,-#34;提示-#34;
,JOptionPane.YES_NO_OPTION);
enable = (option==1);
}
if(!enable){
//忽略其他事件,交给JFrame处理
super.processWindowEvent(e);
}
}