站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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);
}
}


↑返回目录
前一篇: 请问这是怎么回事Invalid parameter binding(s).
后一篇: 关于ArrayList的问题,在线等