2015-10-30 131 views
5

在我的計劃,我希望用戶:如何避免嵌套的ActionListeners?

  1. 拾取/打開數據庫(如Access)對自己
  2. 從表中選擇一個表從數據庫
  3. 選擇列(S)

在我的代碼,我有一個類,做這樣的事情:

mntmOpenDatabase.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     //open the database 
     //display tables as buttons 
     tableButton.addActionListener(new ActionListener() { // select a table 
      public void actionPerformed(ActionEvent e) { 
       //display the columns of the table selected as buttons 
        colButton.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent e) {// add to the list of columns to be exported } 

這導致了一個非常大的代碼塊。有沒有更乾淨,更簡單的方法來做到這一點?

+2

[如何使用操作(HTTP://文檔。 oracle.com/javase/tutorial/uiswing/misc/action.html) – MadProgrammer

回答

10

的解決方案是重構:

  • 用於代碼打開數據庫創建一個單獨的,並分別可測試的類。
  • 以及一個單獨的可單獨測試的類來顯示這些數據。
  • 在ActionListener中,創建這些類的實例,或者與它們交互(如果它們已經存在)。
  • 瞭解M-V-C(模型 - 視圖 - 控制)設計模式的基本原理,並使用它們。你不必對他們冷淡,主人知道有很多變種,但他們的總體指導原則至少應該受到尊重。
  • 盡力讓您的GUI或視圖爲啞儘可能。它知道如何顯示其數據,它具有允許控件更新其顯示的功能,並且知道如何在用戶與之交互時通知控件,這就是它。
  • 建議1:確保所有數據庫交互都在後臺線程中完成。
  • 方面建議2:確保幾乎所有的Swing交互都在Swing EDT(事件派發線程)上完成。

請看這個相似但更完整的問題和答案:How can one best avoid writing bloated GUI code?。答案是一樣的好,我希望我可以投票給他們數十億次。

例如,你上面的代碼可能是簡單的:

mntmOpenDatabase.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     control.openDatabase(); 
    } 
} 
+0

所以我終於做了一些有關MVC的研究。我想我有種基本的想法,但是我仍然想知道,我應該在哪裏放置ActionListeners?在控制器或視圖內?對此似乎有不同的看法。 – PuggyLongLegs

+1

@ForeverLearning:這是因爲兩者都可以正常工作。在我看來,如果ActionListeners在視圖中,那麼它們非常簡單,他們所做的就是調用一個等效的控制方法,就像我上面展示的那樣。否則,你可以讓控制注入動作到視圖中。 –

+0

聽起來不錯。我想我會嘗試。但是,創建一個包含所有動作偵聽器的Action類,或者將它們全部放在同一個類中,並且這些組件是好的,是不是一個好主意? – PuggyLongLegs

1

在你的榜樣,您將實例化和每個動作事件添加新的監聽器。真的,你應該配置一次。事情是這樣的:

public class OpenDataBaseListener implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
       //your event handling here 
     } 
} 

public class TableButtonListener implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      //your logic 
     } 
} 

等等

當你創建你的聽衆,你應該註冊一次他們:

mntmOpenDatabase.addActionListener(new OpenDataBaseListener()); 
tableButton.addActionListener(new TableButtonListener()); 
colButton.addActionListener(new ColButtonListener());