0

我有以下java代码片段:

public static void main(String[] args) {

    String filename = args[0];

    JFrame f = new JFrame("Load Image Sample");

    f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    f.add(new LoadImageApp(filename));
    f.pack();
    f.setVisible(true);
}

其中WindowClosing定义了一个事件。如何从我的代码中触发/执行/启动此事件,从而导致代码退出?

附加问题:我在代码中看到的这个结构是什么:

new WindowAdapter(){...}

即普通括号后跟大括号?

4

3 回答 3

2

看看这个链接。希望能帮助到你

http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

http://weblogs.java.net/blog/joshy/archive/2006/02/all_hail_the_pr.html

此外,在这种特定情况下,您实际上并不需要触发事件,因为它所做的只是调用System.exit(0)。您想要在代码中手动触发事件的唯一原因是模拟某人单击“X”按钮以关闭窗口(而不是通过其他方式关闭程序)。

于 2013-10-02T19:15:49.430 回答
2

有关此主题的一些一般性想法,请参阅关闭应用程序。

ExitAction展示了一种将事件分派到框架的方法。该操作旨在与 JMenuItem 或 JButton 一起使用,以使用户能够通过单击“X”以外的其他方式关闭框架。

于 2013-10-02T19:19:51.950 回答
0

好吧,模拟事件真的没有意义。为什么?因为当事件被触发时,这意味着你的应用程序中发生了一些事情,这就是'Java'告诉你的方式:“嘿,发生了一些事情!这是事件,所以你可以适当地处理它。”。在您的情况下,可能是用户按下 X 按钮,或者操作系统正在关闭。您真正想要在这里做的是关闭应用程序,而不是触发事件。考虑一下:

f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e) {
            ThisClassName.this.shutDown();
        }
    });
//...
}

private void shutDown(){
    System.exit(0);
}

这样,您可以从任何地方调用shutDown()。

关于括号,它被称为匿名类。它和其他任何类一样,只是没有名称。由于 JFrame 在其 addWindowListener 函数中需要一个 WindowListener 作为参数,因此您需要传递它。问题是,您的代码中的其他任何地方都不需要 WindowAdapter,因此无需保留对它的命名引用。

于 2013-10-02T19:38:40.967 回答