在Java中处理和关闭窗口

Key*_*ack 5 java user-interface awt

好吧,所以这可能是一个愚蠢的问题,但我是Java的新手,并且在我养成任何坏习惯之前尝试以正确的方式教自己.

无论如何,昨晚我正在编写一个程序,包括一个扩展Frame的自定义类和一个扩展Canvas的自定义类.main()方法在canvas类中,我在那里创建了一个框架类的实例.问题是当程序检测到窗口关闭事件时,我无法丢弃框架,因为我似乎无法从主方法外部访问它.如果我尝试在main()之外定义它,那么我就无法在其中使用它.所以我最终跳过dispose()并只使用System.exit(0).这好吗?它基本上是在做同样的事情吗?或者这是我需要解决的问题,如果是这样,任何想法如何?

非常感谢您的阅读,

科迪

fin*_*nnw 6

您可以从source事件的属性获取对框架的引用:

class MyWindowListener extends WindowAdapter {

    public void windowClosing(WindowEvent e){
         Frame frame = (Frame) e.getSource();
         frame.dispose();
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,由于这是一个在构造函数中声明的匿名类(可能),您还可以访问封闭实例,因此您也可以将其写为:

class MyFrameClass extends Frame {
    public MyFrameClass() {
        this.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                 MyFrameClass.this.dispose();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使它更简单(因为你的WindowListener没有自己的方法称为"dispose"):

public void windowClosing(WindowEvent e){
     dispose();
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*nie 5

这不是一个愚蠢的问题.但是,由于垃圾收集器不是一个大问题,有时候当窗口关闭时你会想要执行一些清理工作.所以有些建议:

Window Closing事件应该从Frame本身处理.例如:

    this.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){
                  //code here to perform as the window is about to close.
         }
        });
Run Code Online (Sandbox Code Playgroud)

我建议你为main方法创建一个单独的类来调用Frame等.