JavaFX中的事件处理

时间:2013-12-03 16:44:21

标签: java event-handling javafx

我对事件处理的主题感到困惑。

我正在尝试实施游戏。我已经分别编写了游戏逻辑和GUI(在JavaFX上)。

下面是一些示例代码;我能做什么才能在执行updateScoresLabel()方法时运行setScore(...)方法?

public class MyGameLogic
{
    private int scores=0;

    public void setScore(int scores)
    {
        this.scores=scores;
    }

    public int getScore()
    {
        return scores;
    }

}



public class JustAGUIExample
{
    Label scoresLabel;
    MyGameLogic gameLogic;

    public void updateScoresLabel()
    {
        this.scoresLabel=gameLogic.getScore();
    }
}

2 个答案:

答案 0 :(得分:4)

使用绑定而不是事件处理程序

发生模型更改时,您不需要事件处理程序来完成标签更新。

您可以将{property}属性bind添加到模型属性中,然后当您更改模型时,标签将自动更新。

调整问题中的代码以使用绑定。

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.control.Label;

public class MyGameLogic {
    private IntegerProperty scores = new SimpleIntegerProperty(0);

    public void setScore(int scores) {
        this.scores.set(scores);
    }

    public int getScore() {
        return scores.get();
    }

    public IntegerProperty scoreProperty() {
        return scores;
    }
}

class JustAGUIExample {
    private Label scoresLabel;
    private MyGameLogic gameLogic;

    public JustAGUIExample() {
        scoresLabel.textProperty().bind(
            gameLogic.scoreProperty().asString()
        );
    }
}

JavaFX tic-tac-toe game example中有大量关于此类绑定策略的示例。

对于更复杂的逻辑,请使用ChangeListener

假设你在分数变化时也想发挥胜利的声音,你可以使用这样的东西:

class JustAGUIExample {
    private Label scoresLabel;
    private MyGameLogic gameLogic;
    private AudioClip levelUpAudio = new AudioClip("levelup.mp3");

    public JustAGUIExample() {
        scoresLabel.textProperty().bind(
            gameLogic.scoreProperty().asString()
        );

        gameLogic.scoreProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                levelUpAudio.play();
            }
        });
    }
}

所以ChangeListener有点像属性更改的事件监听器。但我只是说,因为在JavaFX事件中有各自独立的东西,通常保留用于GUI系统事件,如鼠标点击,窗口大小调整通知,触摸板滑动等。

使用Java 8语法更好:

gameLogic.scoreProperty().addListener((observable, oldValue, newValue) ->
    levelUpAudio.play()
);

Java中的事件处理教程

即使您不需要对问题中的示例进行事件处理,您也可以阅读Oracle JavaFX event handling tutorial以了解事件的真实情况以及它们的工作原理。

关于基于摇摆的建议的想法

在编写JavaFX程序时,请忽略任何与Swing中的事件处理相关的建议。相反,学会用JavaFX方式做这些事情,否则你只会迷惑自己。

答案 1 :(得分:0)

对于运行事件的GUI,该类必须实现ActionListener。由此,必须将actionPerformed方法添加到该类中。

以下是

的示例实现
 //Run, help, and about are all buttons on this frame
 public void actionPerformed(ActionEvent e){
    if(e.getSource() == run){ //Check if the event was the run button being pressed
        //Run the "run" program
    }else if(e.getSource() == about){ //Check if the event was the about button being pressed
        //Open welcome
    }else if(e.getSource() == help){ //Check if the event was the help button being pressed
        //Have the help screen appear
    }
}