更新:找到一种更简单的方法来重现错误的行为
当我在三个变量之间设置双向JavaFX绑定时,这种绑定有时会被不相关的代码破坏.
我创建了一个能够重现错误行为的小示例程序:
在MainController中,设置绑定并添加三个侦听器以输出变量的新值:
package bug;
import java.nio.file.Path;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
public class MainController {
@FXML
private Foo foo;
@FXML
private Bar bar;
private ObjectProperty<Path> pathProperty = new SimpleObjectProperty<>();
@FXML
private void initialize() {
pathProperty.addListener((observablePath, oldPath,
newPath) -> {
System.out.println(newPath);
});
foo.pathProperty().addListener((observablePath, oldPath,
newPath) -> {
System.out.println(newPath);
});
bar.pathProperty().addListener((observablePath, oldPath,
newPath) -> {
System.out.println(newPath);
});
bar.pathProperty()
.bindBidirectional(pathProperty);
foo.pathProperty()
.bindBidirectional(pathProperty);
}
}
Run Code Online (Sandbox Code Playgroud)
FooController使用由按钮单击触发的计数器更改其中一个变量.按下按钮应输出相同的值三次,因为我们设置了三个监听器.只要不更改DatePicker的值,这就可以正常工作.但之后每个号码只输出一次.
package bug;
import java.nio.file.Paths;
import java.time.LocalDate;
import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.DatePicker;
public …Run Code Online (Sandbox Code Playgroud)