2013-10-23 59 views
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 .. 
    } 

} 

所以我的問題是,我怎麼能稱之爲「solveGame()」使用了「freshGame」實例「myGame」類中?

+2

你的類名應該以大寫字母開頭。 –

+0

如果只有一個實例,那麼調用'solveGame()'只能在該實例上調用。它不工作?你真正的問題是什麼? – John3136

+0

您是否嘗試使用freshGame作爲myGame類的全局變量? – ds345

回答

0

我完全不明白你的問題。我所理解的是,您無法通過freshGame對象調用solveGame()函數,該對象是您的myGame類的實例。

solveGame()功能是Board類,所以你只能通過Board實例調用它。
所以你必須在你的myGame類中創建Board的實例來使用它,可能會像下面這樣。

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

謝謝,這幫助我按預期工作。我忘了將Board對象分配給全局變量,您的回答幫助我意識到了這一點。 – AgentOrange

1

短通用的答案:

在Java中,如果你有一個對象,也稱爲類的實例,例如

MyClass myObj = new MyClass(); 

然後你就可以訪問非靜態成員這個對象的類是這樣的:

myObj.myMethod(); 

哪裏你要打電話的方法,你應該d 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(); 
    } 
} 
相關問題