为什么要使用JavaFX属性?

时间:2016-10-16 19:14:29

标签: java javafx

原谅我的问题,如果它看起来很愚蠢,但我很好奇。我正在制作一个Java程序,它将有一个GUI,并对整个属性的想法感到好奇。为什么在我们可以向类添加数据时使用它们?例如:

class myButton extends Button {

   private boolean booleanProperty = false;

   myButton(args...) {
      // Do something with the property
   }

   public void setProperty(boolean value) {
      this.booleanProperty = value;
   }

   public boolean getProperty() {
      return this.booleanProperty;
   }
}

似乎可以正常工作以存储关于按钮的自定义实现的其他信息。但是怎么样:

class myButton extends Button {

   private SimpleBooleanProperty booleanProperty = new SimpleBooleanProperty(false);

   myButton(args...) {
      // Do something with the property
   }

   public void setProperty(boolean value) {
      this.booleanProperty.set(value);
   }

   public boolean getProperty() {
      return this.booleanProperty.get();
   }
}

唯一真正的区别,我看到(纠正我,如果我错了)是你可以将听众附加到属性值,但我觉得好像不仅仅是那个。想法?

5 个答案:

答案 0 :(得分:5)

JavaFX属性的强大之处在于它们可以以一种在发生更改时自动更新UI的方式进行绑定。

例如,如果textField不包含任何值,请考虑要隐藏的元素:

TextField tf = ...
Node container = ...
container.visibleProperty.bind(tf.textProperty.isNotEmpty());

现在当您更改tf中的文字时,您会看到container根据文字的存在切换是否可见。

答案 1 :(得分:3)

它们在很多方面都非常有用,我甚至在非UI相关的东西中使用它们。但是看看这个例子:你是一个无人管理的课程

public class UndoManager {
    BooleanProperty canUndo = ...;
    BooleanProperty canRedo = ...;

    ...
}

你有3个地方可以调用撤消/重做。

MenuButton menuUndo;
Button toolbarUndo;
MenuButton contextMenuUndo;

你基本上只能这样做:

menuUndo.disabledProperty().bind(undoManager.undoProperty()):
toolbarUndo.disabledProperty().bind(undoManager.undoProperty());
contextMenuUndo.disabledProperty().bind(undoManager.undoProperty());

你再也不用担心了。如果你添加一个可以发生撤消的新地方,你也必须绑定它。

答案 2 :(得分:3)

在这种情况下,您没有任何好处,因为您不允许访问属性对象本身。通常这样做。

这允许您向属性添加侦听器,并在更改时收到通知。

绑定使用这种可能性来保持值相同,属性以及Bindings类提供了简单转换属性的方法。

BooleanProperty booleanProperty = new SimpleBooleanProperty();
booleanProperty.addListener(new ChangeListener<Boolean>() {

    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        System.out.println("property changed form "+oldValue +" to "+newValue);
    }
});
booleanProperty.set(true);
booleanProperty.set(true);
booleanProperty.set(false);
booleanProperty.set(false);
booleanProperty.set(false);
booleanProperty.set(true);
booleanProperty.set(false);
booleanProperty.set(true);
booleanProperty.set(false);

此外,它允许您传递表示属性的对象。例如。必须写/读booleanProperty的代码不需要有关myButton来写/读属性的信息;你可以通过该物业。

TableView是一个利用属性的类的例子。与TableView一起使用的列从TableViewTableView中的项中获取属性,以注册该属性的侦听器。这允许它更改单元格中显示的值,即使更改是在代码中的其他位置触发的。此外,对于可编辑单元格,可以自动修改项目的属性。

答案 3 :(得分:1)

想象一下,编制一个能够照顾到餐馆客户的机器人。如果不使用像房产听众这样的东西,它将如何回应客户或任何其他必须处理的任务。

使用属性侦听器的好处是可以使程序变为Concurrent。如果没有客户在接下来的1小时内到达,那么您的Sequentially制作的程序将会在下一个小时内无效。在这个示例中,可能更灵活地切换单词Concurent会更好,但您应该查找Concurent programmingSequence programming。这些属性允许您自定义制作程序concurent

您还应该知道您使用的gui已经使用了基于相同原理的内置(事件监听)功能。

现在,如果你制作了这个机器人 - 而不是一次交给1个客户 - 那取决于必须做什么。向顾客询问食物的味道(如果顾客已经吃过),接受新订单(如果需要 - 通过ANYBODY),拿餐(当任何顾客付款并且餐桌上有菜)时,处理付款(当被要求时)任何人)。并且处理到达餐厅的新客户。

同时制作的程序将处理任何客户所需的任何任务。顺序制造的机器人一次只能处理一个客户。也许只有这样,它才能被限制在招呼顾客并将它们放在座位上,无论如何有用。 (每个客户不能拥有1个机器人。)

有些人认为顺序编程更容易也可以这么说。这是因为很难跟踪必须按特定顺序完成的子任务。例如,当没有到达任何顾客时,机器人不应该寻找餐具。如果它收到付款电话会发生什么?因此很难确定优先顺序并完成不同的任务。然而,当成功完成它时,程序变得更加有效。它将能够执行任务而不仅仅是单人任务。

是的,属性的唯一目的确实是你可以添加监听器。

答案 4 :(得分:0)

使用javafx属性为预制对象保存任意值供以后使用。因此,您可以将值设置为文本字段或其他不会直接影响显示值的对象