2013-03-19 3 views
-1

Итак, у меня есть класс, который расширяет JPanel, и внутри конструктора я добавляю свой JButtons и все, что мне нужно добавить. У меня также есть MainFrame класс, который является контейнером (JFrame) и этот класс будет принимать аргумент из класса под названием FrameSwitcher (Controller), который будет оценивать, какие кнопки были нажаты, и передать эту информацию в 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"); 
    } 
} 

Тогда мой MainFrame:

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

+0

Внедрите ActionListener в свой класс FrameSwitcher и в своем классе MainMenu добавьте каждой кнопке ActionListener (FrameSwitcher). –

ответ

2

В вашем MainMenu классе, вам нужно добавить какое-то слушатель, что заинтересованные стороны могут зарегистрироваться с, поэтому, когда происходит какое-либо событие, они могут быть уведомлены.

Простейшим решением было бы предоставить метод addActionListener, который делегирован каждой из кнопок. Это, однако, может выставить части приложения, которое вы не выставили (слушатель теперь имеет прямой доступ к JButton и может делать с ним всевозможные неприятные вещи).

Лучшим решением было бы создать что-то вроде MainMenuListener, который имел такие методы, как startSinglePlayer и startMultiPlayer

Вы бы затем обеспечить способ add/removeMainMenuListener внутри в вашем MainMenu классе.

Каждая кнопка будет затем зарегистрировать там собственный actionListener и огнестойкость соответствующего событию меню Listener

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

Сначала вы должны создать ActionListener как это

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

Тогда звоните,

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

Разве это не заставило меня написать мои исполнители действий в самом классе MainMenu? Если нет, то как это позволит мне получить доступ к кнопкам из другого класса, которые делают это так? Я предполагаю, что MyActionListener будет содержать в массиве?, JButtons и я передаю их через FrameSwitcher, который возвращает необходимые данные в MainFrame? –

+0

Ваше приложение архивировано по-настоящему странно - после быстрого чтения я не могу понять, что говорит с чем или что вы пытаетесь выполнить. Можете ли вы просто описать, что вы хотите, чтобы ваше готовое приложение выполняло, и я предложу упрощенный дизайн? –

+0

Конечно, это просто графический интерфейс для моего приложения. Он предназначен для главного меню, которое будет иметь четыре кнопки, singlePlayer, multiPlayer, scoreBoards и выйти. Каждая кнопка инициализирует что-то другое. Кроме того, в зависимости от того, какая кнопка нажата, к ней придет определенная логика, поэтому, например, вы выбираете singleplayer, тогда будет вызываться логика одного игрока, и игра будет продолжена. Кроме того, изнутри этих панелей, таких как одиночный игрок, появится панель JMenu, которая приведет вас либо в главное меню, либо на табло. –

Смежные вопросы