0

我正在修改一些现有的 Java 代码以进行分配,但我不知道如何从 ActionListener 中调用现有对象的函数。

“myGame”只会有一个实例。

这是相关代码;

public class myGame extends JFrame { 
    public myGame() { 
        //...snip...

        statsBar = new JLabel(""); 
        add(statsBar, BorderLayout.SOUTH); 

        add(new Board(statsBar)); 

        setResizable(false); 
        setVisible(true);

        addMenubar();
    } 

    private void addMenubar() {
        JMenuBar menubar = new JMenuBar();
        JMenu topMnuGame = new JMenu("File");
        JMenuItem mnuSolve = new JMenuItem("Solve");
        mnuSolve.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {

              // freshGame.solveGame();
              // this is where I need to call the solveGame function
              // for the "freshGame" instance.
              solveGame();

            }
        });
        topMnuGame.add(mnuSolve);
        menubar.add(topMnuGame);
}
    public static void main(String[] args) { 

      myGame freshGame = new myGame();

    }

}

.

public class Board extends JPanel { 

public Board(JLabel statsBar) {
    this.statsBar = statsBar; 

    //..snip..

    addMouseListener( new gameAdapter() ); 
}

    public void solveGame() {
    // .. do stuff with object ..
    }

}

所以我的问题是,如何使用“freshGame”实例从“myGame”类中调用“solveGame()”?

4

2 回答 2

1

简短的通用答案:

在 Java 中,如果您有一个对象,也称为类的实例,例如

MyClass myObj = new MyClass();

然后,您可以像这样访问该对象的类的非静态成员:

myObj.myMethod();

无论您在哪里调用方法,都需要对正确对象的引用,因此将其作为参数传递给需要它的方法:

class OtherClass {
    // snip constructors etc
    public void otherMethod(MyClass obj) {
        obj.myMethod();
    }
}

或者,将其作为构造函数参数传递并将其存储在私有成员变量中,以便稍后从方法中调用它。

class SomeClass {

    private final MyClass someMyClass;

    SomeClass(MyClass someMyClass) {
        this.someMyClass = someMyClass;
    }

    public void someMethod() {
        this.someMyClass.myMethod();
    }
}
于 2013-10-23T07:08:23.197 回答
0

我不完全明白你的问题是什么。我的理解是你不能用你的类实例的对象调用solveGame()函数。freshGamemyGame

1.你的solveGame()函数在BoardClass中,所以你只能通过Board实例调用它。
2所以你必须Board在你的 myGame类中创建实例才能使用它,可能如下所示。

public class myGame extends JFrame { 
  private Board board;
  public myGame() { 
    //...snip...

    statsBar = new JLabel(""); 
    board= Board(statsBar ) // initializing Board Class . you can do your self 

    add(statsBar, BorderLayout.SOUTH); 
    add(new Board(statsBar)); 
    setResizable(false); 
    setVisible(true);
    addMenubar();
} 

private void addMenubar() {
    JMenuBar menubar = new JMenuBar();
    JMenu topMnuGame = new JMenu("File");
    JMenuItem mnuSolve = new JMenuItem("Solve");
    mnuSolve.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {

          // freshGame.solveGame();
          // this is where I need to call the solveGame function
          // for the "freshGame" instance.
          solveGame();

          // now you can call 
            board.solveGame();
        }
    });
    topMnuGame.add(mnuSolve);
    menubar.add(topMnuGame);
 }
public static void main(String[] args) { 
    myGame freshGame = new myGame();
 }
}
于 2013-10-23T07:01:46.630 回答