以下问题是我的 JavaFX 应用程序中错误的根源。奇怪的是,该行为取决于特定的 JavaFX 属性是否附加了侦听器。当属性被 a 观察时一切正常ChangeListener,否则无效。它开始让我发疯......
我设法将其分解为一个最小的代码示例。首先,我们需要一个类来公开一个时不时变化的属性。这里就叫nameProperty(). 在此示例中,我选择生成一个单独的线程来不断修改属性,但在实际应用程序中,它是通过用户交互发生的。
class TestClass {
private final SimpleObjectProperty<String> name = new SimpleObjectProperty<>();
public TestClass() {
new Thread(() -> {
while(true) {
try {
Thread.sleep(1000);
Platform.runLater(() -> name.set("A"));
Thread.sleep(1000);
Platform.runLater(() -> name.set("B"));
}
catch(InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}
public ReadOnlyObjectProperty<String> nameProperty() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
在 main 方法中,在 FX 应用程序线程上,ObservableList<TestClass>使用提取器创建 an ,以便nameProperty()由 报告对列表元素的更改ListChangeListener。然后,我们创建测试类的一个实例,将其添加到列表中,并添加 aListChangeListener以观察列表的更新。
public static …Run Code Online (Sandbox Code Playgroud) 考虑一个带有内置整数常量const N: u64和运行时整数值的 Rust 程序x: u64。我想进行匹配,x使x < N每个值都有一个单独的特殊情况。此外,还应该分别有一个单独的 case forx == N和一个 for x > N。我的第一次尝试是这样的:
const N: u64 = 3;
match x {
0 => println!("Special case for 0"),
1 => println!("Special case for 1"),
2 => println!("Special case for 2"),
N => println!("Equal"),
_ => println!("Larger"),
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但它有以下缺点:想象一下,我将常量的值增加到N = 4但忘记添加新的特殊情况x = 3。上面的代码不会在编译时捕捉到这一点,因为最后一个匹配模式 ( _) 也覆盖了被遗忘的情况,并且代码会默默地中断。所以我正在寻找一种具有这种编译时保证的解决方案。
为了实现这一点,最后一个案例应该只匹配x > N,所以我尝试使用一个if条件: …