2010-11-18 156 views
2

有沒有辦法讓我將變量傳遞給actionlistener而不將它們作爲final來調用呢?我想以某種定時的方式使用這兩點......我嘗試過使用Thread.sleep(),但由於某種原因,它與該程序的其餘部分沒有良好的配合。這是我真正想使用的格式,但我意識到可能無法使其工作。 我願意接受任何建議。謝謝!將變量傳遞給Java ActionListener?

(對不起,如果這是一個愚蠢的問題,我已經找了一個答案,但似乎無法找到一個。)

public void timedMain(Point current, Point wanted){ 
      ActionListener taskPerformer = new ActionListener(){ 
       public void actionPerformed(ActionEvent evt){ 
        System.out.println(wanted+" "+current);}}; 
        actiontimer = new Timer(delay, taskPerformer); 
        actiontimer.start();} 

回答

4

你可以做到這一點,避免聲明參數爲最終的。

public void timedMain(Point current, Point wanted) { 
     final Point c = current; 
     final Point w = wanted; 
     ActionListener taskPerformer = new ActionListener(){ 
      public void actionPerformed(ActionEvent evt){ 
       System.out.println(w + " " + c);}}; 
       actiontimer = new Timer(delay, taskPerformer); 
       actiontimer.start();} 

或者你也可以改變類型的currentwanted讓他們分別可變Point持有人,並有actionPerformed方法看在持有人的當前值。

但是沒有辦法聲明內部類,以便它可以看到對封閉方法範圍中的變量所做的更改......如果這是您正在嘗試執行的操作。

+0

這似乎工作得很好,因爲我打算使用此代碼段。感謝您的及時回覆,您是一位救生員。 – whuff739 2010-11-18 05:30:16

1

你可以做一些事情

  • 你能促進匿名動作監聽一個(私人靜態)內部類,並傳遞參數給構造

  • 您可以定義建立了一個匿名動作裏的函數而不是將它內聯到你的代碼中,並且使參數到那個函數final

然而,只是標記它們'最終'有什麼問題?

+0

感謝您的及時回覆......我還沒有看過匿名行動的聽衆,我現在正在看這個。 – whuff739 2010-11-18 05:28:17

+0

你的'taskPerformer'是一個匿名動作監聽器。也就是說,當你去'new ActionListner(){...}並且該子類沒有(源代碼)名稱時,會定義一個ActionListner的新子類。 – 2010-11-18 06:35:22