AWT 窗口关闭监听器/事件

22

如果这是一个新手问题我很抱歉,因为我已经花费长时间了。一旦我创建了窗口监听器、窗口事件和其他所有内容,我该如何指定要调用的方法呢?以下是我的代码:

private static void mw() {
    Frame frm = new Frame("Hello Java");
    WindowEvent we = new WindowEvent(frm, WindowEvent.WINDOW_CLOSED);
    WindowListener wl = null;
    wl.windowClosed(we);
    frm.addWindowListener(wl);
    TextField tf = new TextField(80);
    frm.add(tf);
    frm.pack();
    frm.setVisible(true);

}
我正在尝试获取一个URL并下载它,其他部分我都已经解决了,我只是想让窗口关闭。

1
难道你不认为你应该告诉我们你想做什么,你的目标是什么吗?调用一个方法来做什么? - Hovercraft Full Of Eels
1
另外,为什么要使用AWT而不是Swing进行开发? - Hovercraft Full Of Eels
2
我不知道"GCJ"是什么,但我可以告诉你上面的第二个陈述显然是错误的。编辑:你是指Java的GNU编译器吗?你为什么要使用它呢? - Hovercraft Full Of Eels
1
我有点预料到了,GCJ是Gnuc Java编译器,可以生成“本地”的可执行文件,不需要依赖于系统中安装的JVM/JRE才能运行。它并不完整,并仅支持AWT和部分Swing,但它确实支持SWT,这是一个学习的过程(弄清楚这个可恶的东西)! - alexmherrmann
AWT是重量级的,即它的组件使用系统资源。Swing提供平台无关和轻量级组件,例如JButton、JTextField、JTextArea、JRadioButton、JCheckbox、JMenu、JColorChooser等。 - Jaimin Patel
显示剩余5条评论
2个回答

33

窗口关闭方法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class FrameByeBye {

    // The method we wish to call on exit.
    public static void showDialog(Component c) {
        JOptionPane.showMessageDialog(c, "Bye Bye!");
    }

    public static void main(String[] args) {
        // creating/udpating Swing GUIs must be done on the EDT.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                final JFrame f = new JFrame("Say Bye Bye!");
                // Swing's default behavior for JFrames is to hide them.
                f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                f.addWindowListener( new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent we) {
                        showDialog(f);
                        System.exit(0);
                    }
                } );
                f.setSize(300,200);
                f.setLocationByPlatform(true);
                f.setVisible(true);

            }
        });
    }
}

另外还可以查看 Runtime.addShutdownHook(Thread),以便在关闭之前执行任何必要的操作。

AWT

这是该代码的 AWT 版本。

import java.awt.*;
import java.awt.event.*;

class FrameByeBye {

    // The method we wish to call on exit.
    public static void showMessage() {
        System.out.println("Bye Bye!");
    }

    public static void main(String[] args) {
        Frame f = new Frame("Say Bye Bye!");
        f.addWindowListener( new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent we) {
                showMessage();
                System.exit(0);
            }
        } );
        f.setSize(300,200);
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}

谢谢,我仍在努力避免使用swing,但我相信通过一些调整就可以完成这项工作而不需要swing。顺便说一下,如果我在评论中表现得像个巨魔或者其他什么(巨魔是否正确?),请原谅。 - alexmherrmann
1
+1 另请参阅此相关示例 - trashgod
嘿嘿,再加上 SWT,它让 Swing 变得更性感!不过稍微不够便携,也许我可以通过我几乎什么都不知道的神奇 Java 知识自动下载最新的平台库! - alexmherrmann
1
谢谢您特地这样做,正是像您这样的人让Stack Overflow不仅仅是又一个问答网站。 - alexmherrmann

5

终于!感谢您的回答,尤其是像您这样活跃的trashgod! - alexmherrmann
不用客气,我很欣赏你的热情。我也支持 Andrew 和 HFOE 的建议,从他们那里我继续学习。Java 在过去十年中发生了很大的变化,人们应该警惕无意间采用过时的做法。 - trashgod
同意,似乎有很多Java的东西<2004年就已经过时了。 - alexmherrmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接