2017-10-13 77 views
0

我正在製作java JFrame中的菜單。我看到了在同一個班級中對不同事件做出不同反應的兩種方式。一種是使用匿名內部類是從幾年前在這個答案說明: https://stackoverflow.com/a/10472395/5960074哪個更適合在課堂上進行多項操作?匿名內部類或者if語句在actionPerformed()中?

public static void createMenuBar() 
{ 
    //Main Menu Items 

    menubar.add(fileMenu); 
    MainWindow.window.setJMenuBar(menubar); 

    //Sub menu items 
    saveItem = new JMenuItem("Save"); 
    loadItem = new JMenuItem("Load"); 

    //Add to the "File" menu item 
    fileMenu.add(saveItem); 
    fileMenu.add(loadItem); 

    //Anonymous Inner classes for actionListeners 


    //Action event for saving 
    saveItem.addActionListener(new ActionListener(){ //adding the listener 
     @Override 
     public void actionPerformed(ActionEvent e){ //creating the specific action for save 
      System.out.println("You tried to save."); 
     } 
    }); 

} 

在我的代碼看起來這和它的作品(如在這一點上打印「你想救。「到控制檯)。

我見過其他人在類中實現ActionListener,然後在方法actionPerformed()中使用if語句來跟蹤事件的來源。所以有一個事件,但是代碼在觸發它的時候發生了變化。

第一種方法似乎凌亂,第二種方法更容易閱讀。第二種方法是否有理由採用第一種方法?

謝謝。

+1

答案是,兩者都不。它會降低需求。 'Action' API是另一種允許生成可重用代碼塊的方法 – MadProgrammer

+0

您能想到爲什麼其中一個會更好地工作嗎?我試圖設置一個這個類的菜單欄,允許用戶保存和加載數據。 – admiralmattbar

+1

什麼是「更好」是徵求意見。應用不同的風格,並體驗它們如何影響可讀性以及何時從一個切換到另一個。 –

回答

1

對非匿名類使用Action類(儘管它們可以是靜態內部類)。它給你很好的封裝,使代碼可讀,並且在很多方面比使用ActionListener更好。

1

首先,避免使用static,你真的(真的)不需要它,它會促進糟糕的代碼設計。

假設你使用Java 8,從而可以使用拉姆達的:

public void createMenuBar() { 
    ... 
    saveItem.addActionListener(this::save); 
    loadItem.addActionListener(this::load); 
} 

private save(ActionEvent e) { 
    .... 
} 

private load(ActionEvent e) { 
    .... 
} 

如果您不能使用通過內部類是比實現該接口,並使用if報表更好的lambda表達式。

public class MyGui { 
    private class SaveAction implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      .... 
     } 
    } 

    private class LoadAction implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      .... 
     } 
    } 

public void createMenuBar() { 
    ... 
    saveItem.addActionListener(new SaveAction()); 
    loadItem.addActionListener(new LoadAction()); 
} 
} 
+0

感謝您的回覆。我曾經在主要方法中調用這個方法,但現在我沒有,我忘記了擺脫靜態。具體來說,在代碼中使用靜態代碼有什麼不好? – admiralmattbar

+1

我不認爲我們在這裏解釋所有'static'的問題。然而,在'main'函數中寫入諸如'new MyGui()。show()',並在'show()'方法中創建並顯示你的gui。如果遇到問題,可能會出現一個新的SO問題。 –

+1

@admiralmattbar靜態被認爲是不好的做法有很多原因 - 對全局變量進行一些研究。一個問題是他們不允許寫入控制,所以程序的其他部分可以改變引用,並且突然你有不可預知的行爲。它們還會耦合您的核心,並降低可重用性並限制擴展 - 就像一些要點 – MadProgrammer