JFrame确认关闭窗口的问题

use2100 2006-04-08 08:18:41
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,"确定退出系统?","提示",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进程。不知哪里有错。请教
...全文
2380 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
j3q39 2006-09-26
  • 打赏
  • 举报
回复
最好的解决方法:
设置JFrame的setDefaultCloseOperation(DO_NOTHING_ON_CLOSE),然后在windowClosing加入询问退出的代码即可。

这个方法好啊,我理解了,谢谢,其它方法本菜真的看的懂,看来自学能力有待加强啊
混沌骑士 2006-09-22
  • 打赏
  • 举报
回复
最好的解决方法:
设置JFrame的setDefaultCloseOperation(DO_NOTHING_ON_CLOSE),然后在windowClosing加入询问退出的代码即可。
WxmJun 2006-09-20
  • 打赏
  • 举报
回复
好像整个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,"确定退出系统?\n如果已经开局,则不管退出或者断线,服务器都会认为投注有效?","提示"
,JOptionPane.YES_NO_OPTION);

enable = (option==1);
}

if(!enable){
//忽略其他事件,交给JFrame处理
super.processWindowEvent(e);
}
}
ai_Fei 2006-04-16
  • 打赏
  • 举报
回复
此贴结早已
use2100 2006-04-15
  • 打赏
  • 举报
回复
谢了,结帖。
xiachedan 2006-04-14
  • 打赏
  • 举报
回复
结帖吧!
ai_Fei 2006-04-14
  • 打赏
  • 举报
回复
关之前,如果窗口移动了位置,那么等我按取消关闭的时候岂不重新定位了一下,效果不好:)
如果在关之前,把当前窗口位置记住,然后要是取消关闭,就把位置移到刚才记下的哪个位置的话应该更好吧,多嘴了
congliu 2006-04-11
  • 打赏
  • 举报
回复
来迟了,收藏
use2100 2006-04-09
  • 打赏
  • 举报
回复
已试,已解决
我对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("show");
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("frameRef");
frameTest frame1=new frameTest(aFrame);



aFrame.setSize(100,100);
aFrame.setVisible(true);
}
}
mq612 2006-04-09
  • 打赏
  • 举报
回复
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("Test");

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,"是否完全退出该系统?","系统提示",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();
}
}
use2100 2006-04-08
  • 打赏
  • 举报
回复
因为这个comFrame我想将其作为一个模板类,即每次利用extends继承这个内中的窗口设置大小和定位的工作,衍生出来的子类用来作为真正的frame类。

class mainFrame extends comFrame
{
mainFrame()
{
this.add(new JButton("newButton"));
}
}

如果这样的话重新生成的将只是重新生成了comFrame,而没有起到返回一个mainFrame的作用,如果每次修改comFrame中得new xxxFrame()的话重用机制就不太好,请教是否还有其他方法。
use2100 2006-04-08
  • 打赏
  • 举报
回复
因为这个comFrame我想将其作为一个模板类,即每次利用extends继承这个内中的窗口设置大小和定位的工作,衍生出来的子类用来作为真正的frame类。

class mainFrame extends comFrame
{


}


如果这样的话重新生成的将只是
溺水的鱼 2006-04-08
  • 打赏
  • 举报
回复
不会是1.5的问题吧?
...迷惑中
reene2008 2006-04-08
  • 打赏
  • 举报
回复
困惑ing

关注
帐前卒 2006-04-08
  • 打赏
  • 举报
回复
建议你这样做:
public void windowClosing(WindowEvent e)
{
int option= JOptionPane.showConfirmDialog(
this,"确定退出系统?","提示",JOptionPane.YES_NO_CANCEL_OPTION);
if(option==JOptionPane.YES_OPTION)
if(e.getWindow() == this)
{
System.exit(0);
}
else
{
new comFrame();

}
}
帐前卒 2006-04-08
  • 打赏
  • 举报
回复
public void windowClosing(WindowEvent e)
{
int option= JOptionPane.showConfirmDialog(
this,"确定退出系统?","提示",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;
}
仍然可以推出窗口。。。。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧