我对事件处理的主题感到困惑。
我正在尝试实施游戏。我已经分别编写了游戏逻辑和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();
}
}
答案 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
}
}