/*
2008年11月1日15:01:44
功能:生成一个"退出"按钮,一点击它,就关闭整个窗口!
*/import java.awt.*;
import java.awt.event.*;public class TestFrame implements ActionListener
{
Frame f = new Frame("嘿嘿"); public static void main(String[] args)
{
TestFrame tf = new TestFrame(); Button bt = new Button("退出!");
tf.f.add(bt);
tf.f.pack();
tf.f.setVisible(true);
bt.addActionListener(new TestFrame());
} public void actionPerformed(ActionEvent e)
{
//Frame f = (Frame)e.getSource(); //为什么这行代码一旦生效,运行时点击"退出"按钮,就无法关闭窗口了! f.setVisible(false);
f.dispose();
System.exit(0);
}
}
解决方案 »
- 数据库中为什么要用空值?
- 用applet的repaint()方法能完全消除闪烁????
- 有没有像vb里面FSO(FileSystemObject)对文件的操作那么方便用的java包啊?
- [求教]请问如何在JPanel中加入Scroll?
- 求助 求助 大虾们快来帮帮忙吧
- xsl简单问题,请高手帮忙!急!
- 有在 徐家汇 或 延安西路/番禺路 附近上班的要合租的兄弟吗,我觉得还是找个程序员最好,不然搞出个乱七八糟的人合租麻烦就大了
- jb7的编译器有问题??!
- 刚刚学习java,怎么配置其环境?
- 有关ResultSet的问题
- java调用执行bat文件,而不成功的原因,求解
- 抽取[rt.jar] 导致 进程 java.exe 无法自动释放的问题
贴出来和大家一起分享import java.awt.*;
import java.awt.event.*;class TestFrame2 extends Frame
{
public static void main(String[] args)
{
new TestFrame2().launchFrame();
} public void launchFrame()
{
Button bt = new Button("退出");
add(bt);
pack();
setVisible(true);
bt.addActionListener(new MyActionListener());
}
}class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.out.println("我行,我行,我很行!");
Frame f = (Frame)e.getSource(); //27行
}
}/*
在JDK 1.6中的运行结果是:一旦点击"退出"按钮,则立即输出:
---------------------------------------
我行,我行,我很行!
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.Bu
tton cannot be cast to java.awt.Frame
at MyActionListener.actionPerformed(TestFrame2.java:27)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)---------------------------------------
总结: 27行语句编译时无错误,但运行时会出错的!*/
import java.awt.event.*;class TestFrame2 extends Frame
{
public static void main(String[] args)
{
new TestFrame2().launchFrame();
} public void launchFrame()
{
Button bt = new Button("退出");
add(bt);
pack();
setVisible(true);
bt.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("匿名类被执行了!");
Frame f = (Frame)e.getSource(); //30行
}
}
);
}
}
/*
在JDK 1.6中的运行结果是:一旦点击"退出"按钮,则立即输出:
---------------------------------------
匿名类被执行了!
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.Bu
tton cannot be cast to java.awt.Frame
at TestFrame2$1.actionPerformed(TestFrame2.java:30)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)---------------------------------------
总结: 30行语句编译时无错误,但运行时会出错的!*/
Frame f = (Frame)e.getSource();
得到Frame对象f,然后再通过执行f中的setVisible和dispose来关闭整个窗口
想法是好的, 但问题是
Frame f = (Frame)e.getSource();
这行代码就是错的,编译时没错误,但运行时会出错! 换句话说:
如果e是ActionEvent类型,则
Frame f = (Frame)e.getSource(); //error
如果e是WindowEvent类型,则
Frame f = (Frame)e.getSource(); //OK参见下面三个程序
---------------------------------------------------------------
/*
2008年11月1日15:46:49
功能: 点"退出"按钮和左上角的叉子都可以关闭窗口 不过本程序是有问题的,点"退出"按钮 是不起作用的
*/import java.awt.*;
import java.awt.event.*;class TestFrame2
{
public static void main(String[] args)
{
Frame f = new Frame("哈哈");
Button bt = new Button("退出");
f.add(bt);
f.setSize(300, 300);
f.setVisible(true);
bt.addActionListener(new MyActionListener());
f.addWindowListener(new MyWindowListener());
}
}class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Frame f = (Frame)e.getSource(); // 因为本行编译无错误,但运行时会出错,所以一点击"退出"按钮,立马出错
f.setVisible(false);
System.exit(0);
}
}//Frame是Window的一个子类,
class MyWindowListener extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
Frame f = (Frame)e.getSource(); //本行正确,所以点击右上角的×
f.setVisible(false); //改成e.setVisible(false); 编译时会报错,因为e是WindowEvent类对象,而WindowEvent中是没有setVisible 和 dispose()方法的
System.exit(0);
}
}
/*
本程序点退出按钮时,提示出错,但按右上角的×按钮时,窗口正常关闭!
actionPerformed() 和 windowClosing()中的代码是一样的,但前者运行
出错,后者运行时可以关闭整个窗口
*/
--------------------------------------------------------------------------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;class TestFrame2 extends Frame
{
public static void main(String[] args)
{
new TestFrame2().launchFrame();
} public void launchFrame()
{
Button bt = new Button("退出");
add(bt);
pack();
setVisible(true);
bt.addActionListener(new MyActionListener());
}
}class MyActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.out.println("我行,我行,我很行!");
Frame f = (Frame)e.getSource(); //27行
}
}/*
在JDK 1.6中的运行结果是:一旦点击"退出"按钮,则立即输出:
---------------------------------------
我行,我行,我很行!
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.Bu
tton cannot be cast to java.awt.Frame
at MyActionListener.actionPerformed(TestFrame2.java:27)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)---------------------------------------
总结: 27行语句编译时无错误,但运行时会出错的!*/-----------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;class TestFrame2 extends Frame
{
public static void main(String[] args)
{
new TestFrame2().launchFrame();
} public void launchFrame()
{
Button bt = new Button("退出");
add(bt);
pack();
setVisible(true);
bt.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("匿名类被执行了!");
Frame f = (Frame)e.getSource(); //30行
}
}
);
}
}
/*
在JDK 1.6中的运行结果是:一旦点击"退出"按钮,则立即输出:
---------------------------------------
匿名类被执行了!
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.Bu
tton cannot be cast to java.awt.Frame
at TestFrame2$1.actionPerformed(TestFrame2.java:30)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)---------------------------------------
总结: 30行语句编译时无错误,但运行时会出错的!*/
-----------------------------------------------------------------
结贴去