2013-03-19 3 views
-1

그래서 JPanel을 확장하는 클래스가 있고 생성자 내에서 JButtons을 추가하고 추가해야 할 것은 무엇이든 추가합니다. 나는 또한 용기 (JFrame) 인 MainFrame 클래스가이 클래스는 클릭했는지 버튼을 평가하고 내가 해요 MainFrame다른 클래스에서 JButton을 관찰하는 방법?

에 정보를 전달하는 것이다 FrameSwitcher (컨트롤러)라는 클래스에서 인수를 취할 것 이 일을하는 데 어려움을 겪고 있는데, 나는 이것을 할 수있는 적절한 방법을 찾을 수 없습니다. 또한 JButton을 비공개 및 비 정적으로 유지하고자합니다.

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 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."); 
      } 
     } 
    } 
} 

이 예에서, 그것은 컴파일 않지만,하지 않습니다 무엇 :

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"); 
    } 
} 

그런 다음 내 메인 프레임

그럴거야. 또 다른 것은 공공 및 정적 JButton을 현재 보유하고 있다는 것입니다.

+0

는'actionPerformed'이'MainFrame' 클래스는 현재 구현하지 않는'ActionListener' 인터페이스의 방법으로 해당 메뉴 리스너 이벤트를 해고 .. 그래서, 당신은 무엇을 기대 했습니까? 이 전체 디자인은 엉망입니다. 기본 사항으로 돌아갑니다. – mre

+0

ActionListener를 FrameSwitcher 클래스에 구현하고 MainMenu 클래스에서 각 버튼에 ActionListener (FrameSwitcher)를 추가합니다. –

답변

2

, 당신은 이해 당사자와 함께 등록 할 수 있습니다 청취자의 어떤 종류를 추가해야이 같은 ActionListener를 만들어야합니다 따라서 어떤 이벤트가 발생하면 알림을받을 수 있습니다.

가장 간단한 해결책은 각 버튼에 위임 한 방법을 제공하는 것입니다. 그러나 이것은 노출되지 않은 응용 프로그램의 일부를 노출 할 수 있습니다 (청취자는 이제 JButton에 직접 액세스 할 수 있으며 모든 종류의 불쾌한 일을 할 수 있습니다).

더 나은 솔루션은 MainMenu 클래스 그런 다음 내 add/removeMainMenuListener 방법을 제공 할 것 startSinglePlayerstartMultiPlayer

같은 방법을 가진 MainMenuListener 같은 무언가를 창조하는 것입니다.

각 버튼은 다음 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

먼저 당신이 당신의 MainMenu 클래스에서

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

그런 전화 ,

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

실제 MainMenu 클래스에 내 actionListener를 쓰도록하지 않겠습니까? 그렇지 않다면 어떻게하면이 방법으로 다른 클래스의 버튼에 액세스 할 수 있습니까? MyActionListener는 배열에 JButton을 포함하고 MainFrame에서 필요한 데이터를 반환하는 FrameSwitcher를 통해 전달한다고 가정합니다. –

+0

앱이 정말로 이상하게 설계되었습니다. 빨리 읽은 후에 무엇이 이야기하고 있는지 또는 무엇을 성취하려고 하는지를 정확히 알 수 없습니다. 완성 된 앱이 원하는 것을 간단히 기술 할 수 있습니까? 단순화 된 디자인을 제안하겠습니까? –

+0

물론 이건 내 응용 프로그램의 GUI입니다. 그것은 4 개의 단추, singlePlayer, multiPlayer, scoreBoards 및 종료가있을 메인 메뉴를 의미합니다. 각 버튼은 다른 것을 초기화 할 것입니다. 또한 어떤 버튼을 클릭 했느냐에 따라 특정 논리가 생기므로 예를 들어 singleplayer를 클릭하면 단일 플레이어 논리가 호출되고 게임은 계속 진행됩니다. 또한 싱글 플레이어처럼이 패널에서 메인 메뉴 나 스코어 보드로 이동하는 JMenu 바가 있습니다. –

관련 문제