2013-10-02 113 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