Java:Method在另一个类中等待ActionListener

时间:2014-01-17 12:39:45

标签: java swing

我正在制作棋盘游戏。一个类包含主UI(保存,加载,标签等),另一个类包含实际的棋盘游戏按钮(8x8按钮阵列)。

我希望第一堂课等到第二堂课中的所有按钮都被按下,然后继续学习。

这是我应该用线程修复的东西吗?如果是这样,请有人向我发送正确的方向。

更新

MCVE:

public class MyGUI {

JFrame frame;
Panel mainPanel;
Panel boardPanel;

    createGUI () {
        frame = new JFrame();
        mainPanel = new Panel();
        boardPanel = new Panel();

         frame.add(mainPanel);
     }

     addBoard () {
         Board board = new Board(boardPanel);
         frame.setVisibile(true);
     }

 }

----------------------------------------------------

 public class Board {

     Panel boardPanel;

    public Board (Panel boardPanel) {
         this.boardPanel = boardPanel;
     }

     public void createButtons () {

          // (create buttons with for statements - 2D array; add to boardPanel ..)
          button.addActionListener(new Action());

     }

     // Action Listener (abstract class)
     public class ActionListener implements ActionListener {
            public void actionPerformed (ActionEvent e) {
                      amountofButtonsPressed++;
                      if (amountofButtonsPressed >= amountOfButtons) {
                             // go back to the first class and continue
                      }
            }
      }
 }

3 个答案:

答案 0 :(得分:1)

您的第一个类-main UI-应该实现动作侦听器。

在第二堂课的某个初始化点,您必须注册主要课程 class作为按钮的动作侦听器。 您的所有组件都有一个名为addActionListener()的方法,请使用此方法 传递第一个类作为参数。

public class Main implements ActionListener() {


    public Main() {
        new Class2(this);
    }

    public actionPerformed(Event e) {....}

}


public Class2 {

    ActionListener a;

    public Class2(ActionListener a) {
        this.a = a;

        ...
        ...
        button1.addActionListener(a);
        button2.addActionListener(a);

    }

}

答案 1 :(得分:1)

最简单的方法是使用Observer-Observable模式。 将第一个类设为Observer,将第二个类设为Observable。 创建一个字段以保存按钮的状态,并通过update-method将此Object提供给Observer。

示例:

class SecondClass extends Observable {
    private boolean allButtonsPressed = false;

    ... your code here ... 


    private List<Observer> observers = new LinkedList<Observer>();


    public void addObserver(final Observer obs) {
        observers.add(obs);
    }

    private void setObserverValues(final Object value) {
        setChanged();
        for (Observer obs : observers) {
            obs.update(this, value);
        }
    }

    public void yourFunction() {
        allButtonsPressed = true;
        setObserverValues(allButtonsPressed);
    }
}

class FirstClass implements Observer {

    public FirstClass() {
        SecondClass sc = new SecondClass(...);
        sc.addObserver(this);
    }

    @Override
    public void update(final Observable obs, 
            final Object arg) {
        Boolean allButtonsPressed = (Boolean) arg;
        ... your code here ...
    }

}

答案 2 :(得分:0)

可能最简单的方法是让第一个类具有在单独的公共方法中按下所有按钮后必须发生的逻辑。然后,第一个类将自己的实例传递给第二个类。

在第二个类(你有按钮的动作监听器)中,只要按下一个按钮就可以检查是否按下了所有按钮。如果有,那么您将使用第一个类的实例并使用应遵循的逻辑调用该方法。

简而言之,你会有这样的事情:

public class class1
...\\Pre loading
...
launchSecondClass(this, ...)
...

public class class2
... \\Event handlers
class1.postLoad...

我认为这是最简单的方法。另一种方法是使用线程和锁来控制执行顺序。