2013-10-25 30 views
0

我試圖使清潔和OOP代碼爲Java Swing GUI的。 所以我做了一個實現了Runnable的類,並且應該處理所有的操作。 我存儲在一個數據類中的所有數據和組件都充滿了getters和setter。爪哇 - Actionlistner中(不是內部)運行的類不執行

public class UserInterface{ 
... 
    public void foo(){ 
     PanelActions panelActions = new PanelActions(); 
     Thread tProgressbar = new Thread(panelActions, "Update progressbar"); 
     tProgressbar.start(); 
    } 
} 

public class PanelActions implements Runnable{ 
    GUIdata data = new GUIdata(); 
    public void run(){ 

     //submitButton 
     data.getSubmitButton().addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
        //Some code 
      }   
     }); 

     //Browse Button 
     data.getBrowseButton().addActionListener(new ActionListener(){  
      @Override 
      public void actionPerformed(ActionEvent evt) { 
        //Some code 
      }   
     }); 
    }; 
} 

和getter和setter類:

public class GUIdata{ 
    private JButton submitButton; 
    private JButton browseButton; 

    GUIdata(){ 
     submitButton = new JButton(); 
     browseButton = new JButton(); 
    } 

    public JButton getSubmitButton() { 
     return submitButton; 
    } 

    public void setSubmitButton(JButton submitButton) { 
     this.submitButton = submitButton; 
    } 

    public JButton getBrowseButton() { 
     return browseButton; 
    } 

    public void setBrowseButton(JButton browseButton) { 
     this.browseButton = browseButton; 
    } 
} 

但這種方式在actionPerformed代碼是行不通的。線程啓動並且運行方法運行良好。但可能它不想將ActionListener添加到get方法中。即使我試過這個:

JButton browse = data.getBrowseButton(); 

browse.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent evt){ 
     //Some code     
    } 
}); 
data.setBrowseButton(browse);seButton(browse); 

但即使這樣也不正確。

所以沒有任何人知道如何一個ActionListener從另一個類添加到一個按鈕? 謝謝:)

+0

,這些按鈕不會在一個UI的任何地方進行註冊。 –

+0

我看不到任何不執行的原因!但我的問題是:你甚至試圖採取行動嗎?你有沒有嘗試去衝它? – Sage

+0

@SotiriosDelimanolis我將它們添加到UserInterface類中,但這不適合解決此問題。 – Lutske

回答

2

要在單獨的線程中執行按鈕動作請勿將動作偵聽器的創建放入方法運行中,請將要在方法運行中執行的動作放入。從PanelActions

  1. 刪除任何可運行:

    public class PanelActions { 
    GUIdata data = new GUIdata(); 
    
    
    //submitButton 
    data.getSubmitButton().addActionListener(new ActionListener(){ 
        @Override 
        public void actionPerformed(ActionEvent evt) { 
          //Some code 
        }   
    }); 
    
    //Browse Button 
    data.getBrowseButton().addActionListener(new ActionListener(){  
        @Override 
        public void actionPerformed(ActionEvent evt) { 
          //Some code 
        }   
    }); 
    } 
    
  2. 在的actionPerformed創建一個Runnable或線程並啓動它執行

    @Override 
    public void actionPerformed(ActionEvent evt) { 
        Thread thread = new Thread() { 
         @Override 
         public void run() { 
          //Some code 
         } 
        }; 
        thread.start(); 
    } 
    
0

"Update progressbar"給我,你可能需要的印象invokeLater

data.getBrowseButton().addActionListener(new ActionListener(){  
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      EventQueue.invokeLater(new Runnable() { 
       //Some code 
      }); 
     }   
    }); 

這讓事件處理線程處理按鈕點擊(的actionPerformed)。只有稍後,代碼纔會執行​​並響應,重新繪製進度條。

另一個軟件的設計可能是更清潔。您可以使用Action(擴展AbstractAction)。有一些行動,並把它們放入JButtons。似乎

+0

感謝您的提示! – Lutske

+0

在EDT中執行任何事件。我沒有完全明白你的觀點。在'actionPerformed'函數內部'Thread.currentThread()'很容易迴應:'Thread [AWT-EventQueue-0,6,main]'stuff – Sage