小编Ste*_*fer的帖子

具有提取器的 JavaFX ObservableList 根据侦听器的存在更改行为

以下问题是我的 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)

java javafx

2
推荐指数
1
解决办法
117
查看次数

彻底匹配涉及“大于”情况的一系列整数

考虑一个带有内置整数常量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条件: …

rust

2
推荐指数
1
解决办法
94
查看次数

标签 统计

java ×1

javafx ×1

rust ×1