2013-03-19 25 views
-1

所以我有一個課程擴展了JPanel,並在構造函數中添加了我的JButtons以及任何需要添加的內容。我也有一個MainFrame類是容器(JFrame)和這個類將需要一個參數從一個叫FrameSwitcher(控制器),後者將評估點擊了哪些按鈕,並將信息傳遞給MainFrame如何觀察不同類別的JButton?

我班有麻煩這樣做,我找不到一個合適的方式來做到這一點。我也希望保持JButtons私有和非靜態。

的JPanel例如:

public class MainMenu() { 

    private JButton btnSinglePlayer, btnMultiPlayer; 

    public MainMenu() { 
     setLayout(null); 

     btnSinglePlayer = new JButton("singlePlayer"); 
     btnSinglePlayer.setBounds(320, 25, 275, 130); 
     add(btnSinglePlayer); 

     btnMultiPlayer = new JButton("MultiPlayer"); 
     btnMultiPlayer.setBounds(320, 170 , 275, 130); 
     add(btnMultiPlayer); 

    } 
} 

FrameSwitcher:

public class FrameSwitcher implements panelListener { // panelListener is an interface defined else where. 

    public FrameSwitcher(MainFrame frame) { 
     // This is irrelevant to the question. 
    } 

    @Override 
    public void gamePanel() { 
     System.out.println("GamePanel Event: Recieved"); 
    } 
    @Override 
    public void mainMenu() { 
     System.out.println("mainMenu Event: Recieved"); 
    } 
    @Override 
    public void scoreBoardPanel() { 
     System.out.println("scoreBoardPanel Event: Recieved"); 
    } 
} 

然後我大型機:

public class MainFrame extends JFrame implements ActionListener { 

    private PanelListener panelListener; 
    private JFrame mainContainer = new JFrame("Game"); 
    private JPanel mainMenu = new MainMenu(); 

    public void start() { 
     mainContainer(mainMenu); 
    } 

    public MainFrame(JPanel frame) { 
     mainContainer.getContentPane().add(frame); 
     mainContainer.pack(); 
     // Other methods to initialize the frame 
     return mainContainer; 
    } 

    public void switchFrames(PanelListener panelListener) { 
     this.panelListener = panelListener; // PanelListener is an interface. 
    } 

    public void actionPerformed(ActionEvent e) { 

     JButton source = (JButton)e.getsource(); 

     if(source == MainMenu.btnSinglePlayer) { 
      if(panelListener != null) { 
       System.out.println("Recieved the event approriately."); 
      } 
     } 
    } 
} 

在這個例子中,它編譯,但並沒有做到這一點是什麼應該。另一件事是我目前有JButtons公共和靜態,我不想這樣。

+0

'actionPerformed'是'ActionListener'接口,你的'MainFrame'類目前沒有實現的方法..所以,你期望什麼?整個設計都很棘手。回到基礎。 – mre 2013-03-19 20:39:36

+0

在您的FrameSwitcher類中實現ActionListener,並在您的MainMenu類中爲每個按鈕添加一個ActionListener(FrameSwitcher)。 – 2013-03-19 20:42:05

回答

2

在你MainMenu類,您需要添加某種聽衆有關各方能夠與註冊的一個ActionListener,所以當發生某些事件時,可以通知他們。

最簡單的解決方案是提供一個addActionListener委託給每個按鈕的方法。但是,這可能會暴露您未暴露的應用程序的部分(現在,偵聽器可以直接訪問JButton,並且可以對其執行各種令人討厭的操作)。

一個更好的解決辦法是創造這樣一個MainMenuListener其中有你MainMenu類像startSinglePlayerstartMultiPlayer

方法,然後你會內提供add/removeMainMenuListener方法。

每個按鈕將然後註冊自己的存在和actionListener火相應的菜單監聽事件

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.EventListener; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

public class MainMenu extends JPanel { 

    private JButton btnSinglePlayer, btnMultiPlayer; 

    public MainMenu() { 
     setLayout(null); 

     btnSinglePlayer = new JButton("singlePlayer"); 
     btnSinglePlayer.setBounds(320, 25, 275, 130); 
     add(btnSinglePlayer); 
     btnSinglePlayer.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       fireStartSinglePlayer(); 
      } 
     }); 

     btnMultiPlayer = new JButton("MultiPlayer"); 
     btnMultiPlayer.setBounds(320, 170, 275, 130); 
     add(btnMultiPlayer); 
     btnMultiPlayer.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       fireStartMultiPlayer(); 
      } 
     }); 

    } 

    public void addMainMenuListener(MainMenuListener listener) { 
     listenerList.add(MainMenuListener.class, listener); 
    } 

    public void removeMainMenuListener(MainMenuListener listener) { 
     listenerList.remove(MainMenuListener.class, listener); 
    } 

    public void fireStartSinglePlayer() { 
     MainMenuListener[] listeners = listenerList.getListeners(MainMenuListener.class); 
     if (listeners != null && listeners.length > 0) { 
      for (MainMenuListener listener : listeners) { 
       listener.startSinglePlayer(); 
      } 
     } 
    } 

    public void fireStartMultiPlayer() { 
     MainMenuListener[] listeners = listenerList.getListeners(MainMenuListener.class); 
     if (listeners != null && listeners.length > 0) { 
      for (MainMenuListener listener : listeners) { 
       listener.startMultiPlayer(); 
      } 
     } 
    } 

    public interface MainMenuListener extends EventListener { 

     public void startSinglePlayer(); 
     public void startMultiPlayer(); 

    } 

} 
0

首先,你必須創建這樣

class MyActionListener implements ActionListener{ 
    public void actionPerformed(ActionEvent ae){ 
     //do your stuff 
    } 
} 

然後調用,

yourButton.addActionListener(new MyActionListener()); 
+0

這不會強迫我在實際的MainMenu類中寫入actionListeners嗎?如果不是,它如何讓我通過這種方式訪問​​另一個班的按鈕?我假設MyActionListener將在數組中包含?,JButton和我將它們傳遞給FrameSwitcher,它在MainFrame中返回必要的數據? – 2013-03-19 20:46:18

+0

你的應用程序構造得很奇怪 - 在快速閱讀之後,我無法弄清楚什麼是在說什麼,或者你想要完成什麼。你能簡單地描述一下你想要完成的應用程序嗎?我會建議一個簡化的設計? – 2013-03-19 21:12:35

+0

當然,所以這只是我的應用程序的GUI。這意味着有一個主菜單,將有四個按鈕,singlePlayer,multiPlayer,scoreBoards和退出。每個按鈕將初始化不同的東西。另外,根據單擊哪個按鈕,某些邏輯將隨之而來,例如,您單擊單人模式,然後單個玩家邏輯將被調用,遊戲將繼續。此外,從這些面板中,就像單人遊戲一樣,將會有一個JMenu酒吧,將您帶到主菜單或記分牌。 – 2013-03-19 23:03:26

相關問題