这在传统的Java bean(set/get方法)中很简单,但是JavaFX属性包含了可观察的概念和绑定,而且似乎很快就变得复杂起来。
我尝试过绑定,但这使得目标属性不可设置,也尝试过双向绑定,但我只能绑定“相等”,而不能绑定表达式。
我已经开始将range
实现为javafx.beans.property.IntegerProperty
,但是处理监听器等似乎需要大量工作。
private int lower = 0;
private int upper = 0;
public int getLower() {
return lower;
}
public void setLower(int lower) {
this.lower = lower;
}
public int getUpper() {
return upper;
}
public void setUpper(int upper) {
this.upper = upper;
}
public int getRange() {
return upper - lower;
}
public void setRange(int range) {
upper = lower + range;
}
我将如何用JavaFX的方式来实现这一点?这是我试过的
IntegerProperty lower = new SimpleIntegerProperty(this, "lower", 0);
IntegerProperty upper = new SimpleIntegerProperty(this, "upper", 0);
IntegerProperty range = new SimpleIntegerProperty(this, "range", 0);
public LinkedPropTest() { // Constructor
lower.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
range.setValue(upper.getValue() - lower.getValue());
});
upper.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
range.setValue(upper.getValue() - lower.getValue());
});
range.addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
upper.setValue(range.getValue() + lower.getValue());
});
}
我认为这是可行的,但我必须定义一个“虚拟”属性,而且(我认为)添加ChangeListeners会破坏使用惰性计算的机会。
好的,我们需要:
IntegerProperty
对象为SimpleIntegerProperty
IntegerPropertyBase
派生的自定义IntegerProperty
,以根据您的需要实现某些特殊行为。所以我们有您的属性作为会员:
private final IntegerProperty lower = new SimpleIntegerProperty(0);
private final IntegerProperty upper = new SimpleIntegerProperty(0);
private final IntegerProperty range = new IntegerPropertyBase() {
{
upper.addListener(obs -> update());
lower.addListener(obs -> update());
}
@Override
public String getName() {
return "range";
}
@Override
public Object getBean() {
return Main.this;
}
private void update() {
super.set(upper.get() - lower.get());
}
@Override
public void set(int newValue) {
upper.set(lower.get() + newValue);
}
};
private void printStats() {
System.out.println("lower : " + lower.get() + " - upper: "
+ upper.get() + " - range: " + range.get());
System.out.println();
}
@Override
public void start(Stage primaryStage) {
lower.addListener(obs -> {System.out.println("Lower changed"); printStats();});
upper.addListener(obs -> {System.out.println("Upper changed"); printStats();});
range.addListener(obs -> {System.out.println("Range changed"); printStats();});
System.out.println(" ######### TEST #1 #############");
lower.set(5);
System.out.println(" ######### TEST #2 #############");
upper.set(5);
System.out.println(" ######### TEST #3 #############");
range.set(10);
}
因此,我想做的是在运行时使用 类创建一个类型。我希望从中实现运行时类型的接口如下所示。 应生成的类型应如下所示: 接口的显式实现并不是真正必要的,但这是我找到的最多的资源。 作为代码的简短解释。 创建DynamicAssembly/模块/类 创建备份字段和属性本身 为属性创建Get方法的内容 将属性标记为接口的实现 创建新类型 但是,方法向我抛出以下内容: 方法实现中的正文和声明的签名不匹配。类型
问题内容: href="http://google.com" rel="external"> LINK 问题答案: Felix Kling和三十点建议使用属性选择器()。 但这 仅在是 唯一 值 时才有效 。 如果要设置可能具有1个或多个值的链接的样式,则应使用属性选择器: (注意波浪号字符) 这样的链接的示例可能是:
链接计算属性用于与单个属性下的一个或多个预定义计算属性聚合。 语法 (Syntax) var ClassName = Ember.Object.extend ({ NameOfComputedProperty1: Ember.computed(function() { return VariableName; }), NameOfComputedProperty2:
为什么验证器(http://validator.w3.org/)拒绝这个?什么属性是我不知道的“必需”? 错误: 错误行408,第142列:元素链接缺少必需的属性/模块/14ce1e21/peadig eucookie。css'type='text/css'media='all'/
本文向大家介绍C#自动实现的属性,包括了C#自动实现的属性的使用技巧和注意事项,需要的朋友参考一下 示例 自动实现的属性在C#3中引入。 自动实现的属性用空的getter和setter(访问器)声明: 当在代码中写入自动实现的属性时,编译器会创建一个私有的匿名字段,该字段只能通过属性的访问器进行访问。 上面的自动实现的属性语句等效于编写以下冗长的代码: 自动实现的属性的访问器中不能包含任何逻辑,例