2015-04-01 110 views
0

我創建了一個應用程序,它將事件附加到JButton和其他在GUI類中多次實例化的swing組件類。從外部類創建子類的對象實例

MenuItemEventHandler類附加到每個菜單項。當MenuItemEventHandler類是外部的時候,這工作得很好。不過,我需要把它放在GUI類而不是外部。

我剩下的問題是不能從同一包中的另一個外部類引用事件處理程序子類。是否有可能這樣做?

下面是guiclass和事件處理程序子類

public class GUIClass { 

// gui behaviour 

    public class MenuItemEventHandler extends AbstractAction { 

     private String aVariable; 

     private static final long serialVersionUID = 1L; 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // update a JList with added item 
     } 
} 

下面是外部類我想引用到事件處理程序,所以我可以將它連接到GUI對象的集合。

它引用了我無法實現的MenuItemEventHandler類。

public class MenuItem { 

ResturantGUI.MenuItemEventHandler action = ResturantGUI.new MenuItemEventHandler(this.item); 
newButton.setAction(action); 

// attach the event to the menu item 
+2

這氣味是一個可能的[XY問題(HTTP:// mywiki。 wooledge.org/XyProblem)。你爲什麼說,'「但是我需要把它放在GUI類而不是外部。」爲什麼班級本身必須是內部的?幾乎從來沒有絕對需要這一點。 – 2015-04-01 19:37:27

+0

你說*我不能達到*,但不是爲什麼你不能或在嘗試時遇到什麼問題。 – WonderWorld 2015-04-01 19:44:12

+0

再次您好,我試圖在菜單項觸發actionPerformed事件後填充DefaultListModel。這個問題存在於我不知道如何將操作執行事件中的數據傳遞給GUI的情況,而沒有導致產生不必要對象的音調的重疊。 – Machiinate 2015-04-01 19:49:50

回答

2

兩個選擇,要麼你可以MenuItemEventHandlerstatic

所以你聲明你的類是這樣的:

public static class MenuItemEventHandler ... 

,或者你創建一個參考你的事件處理程序的一個實例封閉類GUIClass

東西:

GUIClass guiClass = new GUIClass(); 
MenuItemEventHandler handler = guiClass.new MenuItemEventHandler(); 

個人而言,我發現第二個選項通常是壞的或不正確的設計的氣味。我幾乎從不使用這種結構。如何可以「解決」這種模式只是一個例子(還有其他的,這取決於上下文):

public class GUIClass { 
    public class MenutItemEventHandler { 
      ... 
    } 

    public MenuItemEventHandler createEventHandler() { 
      return new MenuItemEventHandler(); 
    } 
} 

... 

GUIClass guiClass = new GUIClass(); 
MenuItemEventHandler handler = guiClass.createEventHandler(); 
+0

在GUI類中將事件處理程序設爲靜態,並將GUI類更改爲在單獨的類中實例化的視圖。 Eclipse希望我將GUI中的DefualtListModel字段更改爲靜態,我還必須使其受保護,以便其他類無法訪問它,但eventhandler子類可以訪問gui中的DefualtListModel。什麼時候可以讓一個類的字段靜態? – Machiinate 2015-04-02 12:46:06

+0

@Machiinate不惜一切代價避免靜態字段。這個字段是一個常量,它應該是'static final',它應該是一個實例字段。靜態字段是「邪惡的」:-) – 2015-04-02 13:43:02

相關問題