在JavaFX中,根据对象状态的更改更新UI节点的正确方法是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在JavaFX中,根据对象状态的更改更新UI节点的正确方法是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4143字,纯文字阅读大概需要6分钟。
内容图文
![在JavaFX中,根据对象状态的更改更新UI节点的正确方法是什么?](/upload/InfoBanner/zyjiaocheng/687/734581cfae5e4cf194a1f6580c047827.jpg)
具有一个名为Player的Java类,如下所示:
public class Player {
private String playerName;
private int score;
public Player(String playerName) {
this.playerName = playerName;
this.score = 0;
}
public void incrementScore(int by) {
this.score+=by;
}
public String getPlayerName() {
return this.playerName;
}
}
我只是想知道一旦Player实例更改其得分后,更新提供的UI的正确方法是哪种:
public class PlayerUI extends Application {
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage primaryStage) throws Exception {
Player player = new Player("Mario");
VBox box = new VBox();
box.setSpacing(20.);
box.setPadding(new Insets(20.));
Text playerName = new Text("Player: " + player.getPlayerName());
Text score = new Text("Score: " + player.getPlayerScore());
Button incrementScore = new Button("Score up");
incrementScore.setOnAction(new IncrementScoreHandler(player, score));
box.getChildren().add(playerName);
box.getChildren().add(score);
box.getChildren().add(incrementScore);
Scene mainScene = new Scene(box);
primaryStage.setScene(mainScene);
primaryStage.setResizable(false);
primaryStage.show();
}
}
我使用EventHandler进行了处理,该EventHandler接收播放器和涉及的Node作为构造函数中的参数.
public class IncrementScoreHandler implements EventHandler<ActionEvent> {
private Player player;
private Text scoreText;
public IncrementScoreHandler(Player player, Text score) {
this.player = player;
this.scoreText = score;
}
@Override
public void handle(ActionEvent event) {
player.incrementScore(1);
this.scoreText.setText("Score: " + player.getPlayerScore());
}
}
这是正确的吗?重构Player并让playerName和score分别为StringProperty和IntegerProperty更好吗?
解决方法:
是的,您可能希望重构Player类以改为使用可观察的属性.
然后,将您的Text节点(或下面的示例中的Label节点)绑定到这些属性很简单.
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class PropertiesExample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple interface
VBox root = new VBox(5);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
// Create our Player
Player player = new Player("Mario");
// For this example, a simple GridPane will hold our nodes
GridPane gridPane = new GridPane();
// Add our data headers
gridPane.add(new Label("Player:"), 0, 0);
gridPane.add(new Label("Score:"), 0, 1);
// Our labels to hold the changeable data
Label lblPlayerName = new Label();
Label lblPlayerScore = new Label();
gridPane.add(lblPlayerName, 1, 0);
gridPane.add(lblPlayerScore, 1, 1);
// Use the Player properties to bind our displayed values to the Labels
lblPlayerName.textProperty().bind(player.playerNameProperty());
lblPlayerScore.textProperty().bind(player.scoreProperty().asString());
Button btnIncrementScore = new Button("Score Up");
btnIncrementScore.setOnAction(event -> player.incrementScore());
root.getChildren().addAll(gridPane, btnIncrementScore);
// Show the Stage
primaryStage.setWidth(300);
primaryStage.setHeight(300);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
class Player {
private StringProperty playerName = new SimpleStringProperty();
private IntegerProperty score = new SimpleIntegerProperty();
public Player(String playerName) {
this.playerName.set(playerName);
this.score.set(0);
}
public void incrementScore() {
// Add 1 point to our score IntegerProperty
this.score.set(score.get() + 1);
System.out.println(score.get());
}
public String getPlayerName() {
return playerName.get();
}
public StringProperty playerNameProperty() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName.set(playerName);
}
public int getScore() {
return score.get();
}
public IntegerProperty scoreProperty() {
return score;
}
public void setScore(int score) {
this.score.set(score);
}
}
内容总结
以上是互联网集市为您收集整理的在JavaFX中,根据对象状态的更改更新UI节点的正确方法是什么?全部内容,希望文章能够帮你解决在JavaFX中,根据对象状态的更改更新UI节点的正确方法是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。