Java 成员对象调用类方法
我希望这个问题不是对现有问题的重复!我搜索了一下,没有找到我问题的好答案。这是: 我有一个类MyGame,它包含一个按钮成员对象。无论何时单击该按钮,MyGame都应该做一些事情Java 成员对象调用类方法,java,oop,interface,Java,Oop,Interface,我希望这个问题不是对现有问题的重复!我搜索了一下,没有找到我问题的好答案。这是: 我有一个类MyGame,它包含一个按钮成员对象。无论何时单击该按钮,MyGame都应该做一些事情 class MyGame extends Application { MyBoard board = new MyBoard(); MyButton btn = new MyButton(); public MyGame() { board.add(btn); }
class MyGame extends Application {
MyBoard board = new MyBoard();
MyButton btn = new MyButton();
public MyGame() {
board.add(btn);
}
// this method should be called whenever the button is clicked!
public void doSomething() {
doingSomething();
}
}
class MyButton extends Button {
int someData;
// some code here
public MyButton() {
this.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
MyGame.doSomething(); // ==> NOT POSSIBLE!!!
}
});
}
}
类MyGame扩展应用程序{
MyBoard=新的MyBoard();
MyButton btn=新建MyButton();
公共游戏{
板。添加(btn);
}
//只要单击按钮,就应该调用此方法!
公共无效剂量测定法(){
做某事;
}
}
类MyButton扩展按钮{
int-someData;
//这里有一些代码
公共MyButton(){
this.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
MyGame.doSomething();//=>不可能!!!
}
});
}
}
界面是让MyButton和MyGame之间的通信正常进行的最佳方式吗?如果是,你会怎么做
我不想把MyGame对象的引用交给MyButton对象!我认为这不是解决这个问题的好办法
我感谢你的建议和帮助
干杯在
MyGame
的构造函数中,您可以将ActionListener
添加到btn
中,在按钮上执行操作时将调用该按钮
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Insert thing to do within MyGame here
}
});
在
MyGame
的构造函数中,您可以将ActionListener
添加到btn
中,在按钮上执行操作时将调用该函数
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Insert thing to do within MyGame here
}
});
一种方法是另一种方法(游戏应该是button的成员)。我知道你认为“这不是解决这个问题的好办法”,但你认为错了,这真的没有错 或者,将侦听器的注册从按钮的构造函数移到游戏本身:
public MyGame() {
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent arg0) { doSomething(); }
});
}
publicmygame(){
btn.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent arg0){doSomething();}
});
}
一种方法是另一种方法(游戏应该是button的成员)。我知道你认为“这不是解决这个问题的好办法”,但你认为错了,这真的没有错
或者,将侦听器的注册从按钮的构造函数移到游戏本身:
public MyGame() {
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent arg0) { doSomething(); }
});
}
publicmygame(){
btn.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent arg0){doSomething();}
});
}
使“按钮操作”成为创建MyButton
时可以传递给构造函数的界面。例如:
public MyButton(final Runnable action) {
this.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
action.run(); // POSSIBLE!!!
}
});
}
然后,当MyGame
创建一个新的MyButton
时,MyGame
会告诉按钮单击按钮时要做什么:
MyButton btn = new MyButton(new Runnable() {
@Override
public void run() {
MyGame.this.doSomething();
}
}
或者在Java 8中:
MyButton btn = new MyButton(this::doSomething);
注意:我还没有测试过这个。我想我的语法是对的,但我可能弄错了。您可能需要在MyGame
构造函数中而不是在初始值设定项表达式中分配btn
这是一种通用的方法(依赖注入?),适用于很多情况。可能还有其他特定于按钮
(或已为其定义侦听器机制的其他Swing组件)的解决方案。但是这种机制减少了耦合,因为MyButton
实际上不需要知道是谁创建了它,而MyGame
也不需要知道MyButton
计划对Runnable
操作做什么。其他一些可能的解决方案包括让MyGame
做一些MyButton
的工作,这会增加耦合 使“按钮操作”成为创建MyButton
时可以传递给构造函数的接口。例如:
public MyButton(final Runnable action) {
this.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
action.run(); // POSSIBLE!!!
}
});
}
然后,当MyGame
创建一个新的MyButton
时,MyGame
会告诉按钮单击按钮时要做什么:
MyButton btn = new MyButton(new Runnable() {
@Override
public void run() {
MyGame.this.doSomething();
}
}
或者在Java 8中:
MyButton btn = new MyButton(this::doSomething);
注意:我还没有测试过这个。我想我的语法是对的,但我可能弄错了。您可能需要在MyGame
构造函数中而不是在初始值设定项表达式中分配btn
这是一种通用的方法(依赖注入?),适用于很多情况。可能存在特定于
按钮的其他解决方案(或已定义侦听器机制的其他Swing组件)。但是这种机制减少了耦合,因为MyButton
实际上不需要知道是谁创建了它,而MyGame
也不需要知道MyButton
计划对Runnable
操作做什么。其他一些可能的解决方案包括让MyGame
做一些MyButton
的工作,这会增加耦合 如果查看,您将看到有一个名为addActionListener的函数。在谷歌上快速搜索如何使用它,应该会给你大量的信息,从那里继续下去!如果查看,您将看到有一个名为addActionListener的函数。在谷歌上快速搜索如何使用它,应该会给你大量的信息,从那里继续下去!在新的MyButton(new Runnable)匿名类中,“this”代表什么?@dragon66它应该是MyGame。这是——感谢您捕捉到这一点。我还没有测试我的代码。(我怀疑MyGame。这个不是真的必要,而且它会发现doSomething()
在外部类中。)这个答案真的太过分了。你不需要那么复杂。。请看Oli的答案,简单得多。@Crembo该解决方案可能会增加耦合,这增加了维护人员将来试图修改一个类时无意中破坏另一个类的可能性。您引用的答案使MyGame
类成为MyButton
工作的一部分。