Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 成员对象调用类方法_Java_Oop_Interface - Fatal编程技术网

Java 成员对象调用类方法

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

我希望这个问题不是对现有问题的重复!我搜索了一下,没有找到我问题的好答案。这是:

我有一个类MyGame,它包含一个按钮成员对象。无论何时单击该按钮,MyGame都应该做一些事情

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
工作的一部分。