首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定属性无效

绑定属性无效
EN

Stack Overflow用户
提问于 2015-07-07 11:03:42
回答 1查看 66关注 0票数 0

我正在JavaFX上做一个非常简单的游戏。我有两个对象来代表玩家:

  1. player - Player类的实例
  2. playerObj -矩形类的实例,用于表示地图上的播放器

现在,我实现了玩家移动的基本功能,如goUp、goLeft等,这些都改变了player类中的属性X和Y(这些是DoubleProperty类型)。现在我想让玩家的X和Y属性的每一个变化都反映在playerObj中,所以我使用了属性绑定,如下所示:

代码语言:javascript
复制
 playerObj.yProperty().bind(player.yProperty());

但是,当我调用goUp()方法时,player对象中的"y属性“将更改,而playerObj对象中的"y属性”不会更改。所以:

代码语言:javascript
复制
    pane.setOnKeyPressed(e -> {
        switch(e.getCode()) {
            case UP:
                player.goUp();
                System.out.println("player Y property: "+player.yProperty().getValue());
                System.out.println("playerObj Y property: "+playerObj.yProperty().getValue());
                break;
        }
    });

将导致这个结果(在调用goUp()方法3次之后):

代码语言:javascript
复制
player Y property: 245.0
playerObj Y property: 250.0
player Y property: 240.0
playerObj Y property: 250.0
player Y property: 235.0
playerObj Y property: 250.0

为什么当我将playerObj Y属性绑定到player Y属性时,它的Y属性也没有改变?

编辑:完整代码(删除不相关部分)

Player.java

代码语言:javascript
复制
public class Player {

    private DoubleProperty x;
    private DoubleProperty y;
    private Scene scene;

    public Player(Scene scene) {
        this(DEFAULT_NAME, DEFAULT_COLOR, scene);
    }

    public Player(String name, Color color, Scene scene) {
        this.name = new SimpleStringProperty(name);
        this.color = color;
        this.scene = scene;
    }

    public Rectangle drawPlayer() {
        Rectangle player = new Rectangle(getX(),getY(),SIZE_OF_PLAYER,SIZE_OF_PLAYER);
        player.setFill(color);
        return player;
    }

    public Player goUp() {
        if(getY() != 0 && getY() != scene.getHeight()) {
           setY(yProperty().subtract(5).getValue());
       }
    }


    public DoubleProperty xProperty() {
        return x;
    }

    public DoubleProperty yProperty() {
        return y;
    }

    public double getX() {
        return x.getValue();
    }

    public void setX(double x) {
        this.x = new SimpleDoubleProperty(x);
    }

    public double getY() {
        return y.getValue();
    }

    public void setY(double y) {
        this.y = new SimpleDoubleProperty(y);
    }
}

Game.java

代码语言:javascript
复制
public class Game extends Application {

    private Scene scene;
    private Player player;
    private Rectangle playerObj;
    private Pane pane;

    @Override
    public void start(Stage primaryStage) {
        pane = new Pane();
        scene = new Scene(pane,500,500);
        player = new Player(scene);

        player.setX(scene.getWidth() / 2);
        player.setY(scene.getHeight() / 2);
        playerObj = player.drawPlayer();
        pane.getChildren().add(playerObj);
        playerObj.yProperty().bind(player.yProperty());

        pane.setOnKeyPressed(e -> {
            switch(e.getCode()) {
                case LEFT:
                    player.goLeft();
                    break;
                case UP:
                    player.goUp();
                    System.out.println("player Y property: "+player.yProperty().getValue());
                    System.out.println("playerObj Y property: "+playerObj.yProperty().getValue());
                    break;
                case RIGHT:
                    player.goRight();
                    break;
                case DOWN:
                    player.goDown();
            }
        });

        pane.requestFocus();

        primaryStage.setScene(scene);
        primaryStage.setTitle("Game");
        primaryStage.setResizable(false);
        primaryStage.show();

    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 11:39:19

您的xy属性在Player类中实现得不正确。

调用player.setY(...)时,您将创建一个新的DoubleProperty

代码语言:javascript
复制
public void setY(double y) {
    this.y = new SimpleDoubleProperty(y);
}

当然,这不是您的节点先前绑定到的属性。因此,它的值没有反映在节点中。

你需要

代码语言:javascript
复制
public void setY(double y) {
    this.y.set(y);
}

setX(...)也是如此。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31266805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档