如何从类外部调用现有对象的函数?

时间:2013-10-23 04:03:54

标签: java

我正在为一个赋值修改一些现有的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()”?

2 个答案:

答案 0 :(得分:1)

简短的通用答案:

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

MyClass myObj = new MyClass();

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

myObj.myMethod();

无论你要调用某个方法,都需要a reference到正确的对象,所以将它作为参数传递给需要它的方法:

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

答案 1 :(得分:0)

我完全不明白你的问题。我所理解的是,您无法使用solveGame()对象调用freshGame函数,该对象是myGame类的实例。

1。您的solveGame()功能位于Board课程中,因此您只能使用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();
 }
}