2013-10-02 112 views
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(){...} 

即正常括号其次是花的呢?

+0

事件由'JFrame'对象触发,而不是由您触发。第二个问题的答案是它是一个匿名类,您可以在编码时即时定义它。 – Jagger

+3

'New WindowAdapter(){...}'被称为匿名类。首先,“正常括号”被称为括号。其次,当你只需要重写一个类的一个功能时,匿名类就很有用。了解它[这里](http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) –

+0

您可以使用WindowAdapter wa = new WindowAdapter ...然后将WindowAdapter对象传递给addListener,现在你可以从外部操纵WindowAdapter了。 – porfiriopartida

回答

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”按钮关闭窗口(而不是通过其他方式关闭程序)。

+0

不知道为什么这会得到提升,PropertyChangeListener没有帮助。 PropertyChangeListener用于触发PropertyChange事件而不是windowClosing事件。 – camickr

2

请参阅Closing an Application了解有关此主题的一些一般想法。

ExitAction显示了一种将事件分派给框架的方法。该动作是为了与JMenuItem或JButton一起使用,以使用户能够通过除点击“X”之外的其他方式来关闭框架。

0

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

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

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

这样,你可以从任何你想要的地方调用shutDown()。

关于括号,它被称为匿名类。这是一个像任何其他类一样的类,它只是没有名字。由于JFrame需要WindowListener作为其addWindowListener函数中的参数,因此您需要传递它。事情是,你不需要代码中任何其他地方的W​​indowAdapter,所以不需要保留对它的命名引用。

+0

'好吧,模拟这个事件真的没有意义。“ - 我看到你没有阅读我的答案,并按照链接。大多数应用程序添加一个“Exit”菜单项以允许用户使用键盘关闭应用程序。高级用户使用键盘而不是鼠标。 – camickr

+0

这不是重点。我已经多次问过这个问题,初学者没有意识到的是他们通常需要的是重用事件处理程序中的逻辑,而不是模拟事件。因此,不是将逻辑封装在一个函数中,而是尝试模拟点击,拖动,关闭等等。这个答案出现在“我如何模拟JButton click事件”的无数答案之后(为了调用处理程序中的逻辑)。 – Mercurial