/*
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);
}
}

解决方案 »

  1.   

    我搞了半天 基本搞懂了
    贴出来和大家一起分享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行语句编译时无错误,但运行时会出错的!*/
      

  2.   

    再贴一个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行语句编译时无错误,但运行时会出错的!*/
      

  3.   

    //Frame f = (Frame)e.getSource(); //为什么这行代码一旦生效,运行时点击"退出"按钮,就无法关闭窗口了!因为e.getSource()是一个Button对象,而不是一个Frame对象。另外这个变量的名字f和类成员名冲突,会覆盖类成员f的。你可以将其换为:Button bt = (Button)e.getSource(); 
      

  4.   

    我想通过ActionEvent对象获得window信息,看来这是不可能的,因为按钮事件只能获得按钮的相关信息,没法获得按钮所在的整个屏幕的信息,我总结心得如下:写的不太好, 我今天发现把自己的心得录成视频要比写成文件要好的多, 当我们想通过ActionEvent事件关闭整个窗口时,写如下代码
    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行语句编译时无错误,但运行时会出错的!*/
    -----------------------------------------------------------------
      

  5.   

    谢谢huoyin 
    结贴去