原谅我的问题,如果它看起来很愚蠢,但我很好奇。我正在制作一个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();
}
}
唯一真正的区别,我看到(纠正我,如果我错了)是你可以将听众附加到属性值,但我觉得好像不仅仅是那个。想法?
答案 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
一起使用的列从TableView
和TableView
中的项中获取属性,以注册该属性的侦听器。这允许它更改单元格中显示的值,即使更改是在代码中的其他位置触发的。此外,对于可编辑单元格,可以自动修改项目的属性。
答案 3 :(得分:1)
想象一下,编制一个能够照顾到餐馆客户的机器人。如果不使用像房产听众这样的东西,它将如何回应客户或任何其他必须处理的任务。
使用属性侦听器的好处是可以使程序变为Concurrent
。如果没有客户在接下来的1小时内到达,那么您的Sequentially
制作的程序将会在下一个小时内无效。在这个示例中,可能更灵活地切换单词Concurent
会更好,但您应该查找Concurent programming
和Sequence programming
。这些属性允许您自定义制作程序concurent
。
您还应该知道您使用的gui已经使用了基于相同原理的内置(事件监听)功能。
现在,如果你制作了这个机器人 - 而不是一次交给1个客户 - 那取决于必须做什么。向顾客询问食物的味道(如果顾客已经吃过),接受新订单(如果需要 - 通过ANYBODY),拿餐(当任何顾客付款并且餐桌上有菜)时,处理付款(当被要求时)任何人)。并且处理到达餐厅的新客户。
同时制作的程序将处理任何客户所需的任何任务。顺序制造的机器人一次只能处理一个客户。也许只有这样,它才能被限制在招呼顾客并将它们放在座位上,无论如何有用。 (每个客户不能拥有1个机器人。)
有些人认为顺序编程更容易也可以这么说。这是因为很难跟踪必须按特定顺序完成的子任务。例如,当没有到达任何顾客时,机器人不应该寻找餐具。如果它收到付款电话会发生什么?因此很难确定优先顺序并完成不同的任务。然而,当成功完成它时,程序变得更加有效。它将能够执行任务而不仅仅是单人任务。
是的,属性的唯一目的确实是你可以添加监听器。
答案 4 :(得分:0)
使用javafx属性为预制对象保存任意值供以后使用。因此,您可以将值设置为文本字段或其他不会直接影响显示值的对象