- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我扩展了 SimpleObjectProperty<T>
创建自定义延迟加载实现(see here),LazyLoadingObjectProperty<T>
.
要将此通用实现用于 boolean 属性,我使用 LazyLoadingObjectProperty<Boolean>
.
在我的表中,我想将 boolean 属性呈现为 CheckBox
.
尽管如此, CheckBoxTableCell
似乎只适用于 BooleanProperty
但不是 ObjectProperty<Boolean>
.
这是为什么?我该如何解决?
这是一些代码:
public class ExampleTable extends Application {
private static final int NUM_ELEMENTS = 5000;
private final TableView<ExampleBean> table = new TableView<>();
private final ObservableList<ExampleBean> data = FXCollections.observableArrayList();
public static void main(final String[] args) {
launch(args);
}
@Override
public void start(final Stage stage) {
final Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(300);
stage.setHeight(500);
final TableColumn<ExampleBean, Boolean> c1 = new TableColumn<>("A");
c1.setCellValueFactory(new PropertyValueFactory<ExampleBean, Boolean>("p1"));
c1.setCellFactory(CheckBoxTableCell.forTableColumn(c1));
c1.setEditable(true);
c1.setPrefWidth(100);
final TableColumn<ExampleBean, String> c2 = new TableColumn<>("B");
c2.setCellValueFactory(new PropertyValueFactory<ExampleBean, String>("p2"));
c2.setCellFactory(TextFieldTableCell.forTableColumn());
c2.setEditable(true);
c2.setPrefWidth(100);
for (int i = 0; i < NUM_ELEMENTS; i++) {
data.add(new ExampleBean());
}
final ScrollPane sp = new ScrollPane();
sp.setContent(table);
sp.setMaxHeight(Double.POSITIVE_INFINITY);
sp.setMaxWidth(Double.POSITIVE_INFINITY);
sp.setFitToHeight(true);
sp.setFitToWidth(true);
table.setEditable(true);
table.setItems(data);
// table.setMaxHeight(Double.POSITIVE_INFINITY);
// table.setMaxWidth(Double.POSITIVE_INFINITY);
table.getColumns().addAll(c1, c2);
final ContextMenu cm = new ContextMenu();
cm.getItems().add(new MenuItem("bu"));
table.setContextMenu(cm);
final VBox vbox = new VBox();
vbox.setSpacing(5);
VBox.setVgrow(sp, Priority.ALWAYS);
vbox.getChildren().addAll(sp);
scene.setRoot(vbox);
stage.setScene(scene);
stage.show();
}
}
public class ExampleBean {
private ObjectProperty<Boolean> p1;
private ObjectProperty<String> p2;
public ExampleBean() {
p1 = new SimpleObjectProperty(true);
p1.addListener((o, ov, nv) -> {
System.err.println("Value changed " + ov + " -> " + nv);
});
p2 = new SimpleObjectProperty(Integer.toString(new Random().nextInt()));
p2.addListener((o, ov, nv) -> {
System.err.println("Value changed " + ov + " -> " + nv);
});
}
public final ObjectProperty<Boolean> p1Property() {
return this.p1;
}
public final ObjectProperty<String> p2Property() {
return this.p2;
}
}
请注意,该属性是用 Boolean.TRUE
初始化的并且未选中 CheckBoxCells。
此问题未使用/不需要:
public abstract class LazyLoadingObjectProperty<T> extends SimpleObjectProperty<T> {
public LazyLoadingObjectProperty() {
super();
}
public LazyLoadingObjectProperty(final Object bean, final String name, final T initialValue) {
super(bean, name, initialValue);
}
public LazyLoadingObjectProperty(final Object bean, final String name) {
super(bean, name);
}
public LazyLoadingObjectProperty(final T initialValue) {
super(initialValue);
}
private boolean loaded = false;
private final ChangeListener<T> valueChangeListener = (o, ov, nv) -> {
valueExternallyUpdated(nv);
};
/**
* Is called after the background task's finished (success or failure). Override
* if needed. E.g. to bind the value afterwards.
*/
protected void afterLoaded() {
addListener(valueChangeListener);
}
/**
* Returns a {@link Task} that will calculate this Property's value in the
* background.
*
* @return a {@link Task} that will calculate this Property's value in the
* background.
*/
protected abstract Task<T> createTask();
protected T getFailedValue(final Throwable t) {
return null;
}
@Override
public T getValue() {
if (!loaded) {
startLoadingService();
}
return super.getValue();
}
public boolean isLoaded() {
return loaded;
}
public void setLoaded(final boolean loaded) {
// the loaded property has been reset manually. Remove change listener
if (this.loaded && !loaded) {
removeListener(valueChangeListener);
}
this.loaded = loaded;
}
@Override
public void setValue(final T v) {
super.setValue(v);
}
/**
* Starts the {@link Task} that will calculate this Property's value in the
* background.
*/
protected void startLoadingService() {
setLoaded(true);
final Task<T> s = LazyLoadingObjectProperty.this.createTask();
LazyLoadingThreads.getExecutorService().submit(s);
s.setOnFailed(e -> {
setValue(getFailedValue(e.getSource().getException()));
afterLoaded();
});
s.setOnSucceeded(e -> {
setValue(s.getValue());
afterLoaded();
});
}
/**
* Override this callback method to handle external value-change-events
* (not-lazily-loaded). This callback is only called, if the value is updated
* manually, i.e., not via the lazy-loading mechanism.
*
* @param nv
* the new value
*/
protected void valueExternallyUpdated(final T nv) {
// override if needed
}
}
也找到mwe here .
最佳答案
绝对是一个错误,至少在文档中如此,在实现中也是如此:选中的复选框和索引处的可观察值之间的自动双向绑定(bind)(如果可能)是的设计意图。实现未能满足该要求,即使它可以。
快速破解是修复错误的自定义子类,例如(未经正式测试,小心!):
public static class FixedCheckBoxTableCell<S, T> extends CheckBoxTableCell<S, T> {
@Override
public void updateItem(T item, boolean empty) {
checkCallback();
super.updateItem(item, empty);
}
private void checkCallback() {
if (getSelectedStateCallback() != null) return;
ObservableValue<Boolean> observable =
(ObservableValue<Boolean>) getTableColumn().getCellObservableValue(getIndex());
// handled by super
if (observable instanceof BooleanProperty) return;
// can't bidi-bind anyway
if (!(observable instanceof Property)) return;
// getting here if we have a ObjectProperty<Boolean>, that's not handled by super
setSelectedStateCallback(index -> {
ObjectProperty<Boolean> p = (ObjectProperty<Boolean>) getTableColumn().getCellObservableValue(index);
return BooleanProperty.booleanProperty(p);
});
}
}
关于java - CheckBoxTableCell 不适用于 ObjectProperty<Boolean>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49154386/
我有一个带有 NumberSpinner 的场景元素和 ComboBox元素,我想绑定(bind) minValue NumberSpinner的属性(property)valueProperty 为
我要绑定(bind) dp_date_add.valueProperty().bindBi Direction(model.forDateProperty()); 其中 forDateProperty
我有一个名为Tree的类 public class Tree { private Color c; public Color getColor() { retu
假设我有三个类: class A { val bProperty: ObjectProperty = SimpleObjectProperty(B(C("test"))) val cO
我的应用程序有一个包含多个 ObjectProperty 的对象字段。我正在尝试编写一个执行以下操作的辅助方法: 接受任何类型的 ObjectProperty作为参数 显示ChoiceDialog弹出
我的应用程序有一个包含多个 ObjectProperty 的对象字段。我正在尝试编写一个执行以下操作的辅助方法: 接受任何类型的 ObjectProperty作为参数 显示ChoiceDialog弹出
我刚开始学习kivy,我对ObjectProperty类的用法以及它如何将None作为参数感到非常困惑。有人可以解释一下吗?我在kivy教程中找到了它: class PongGame(Widget):
我正在创建一个 kivy 用户界面来显示由我编写为标准 python 对象的数据模型生成的值。本质上,我希望用户能够按下一个按钮,这将更改底层数据模型,并且此更改的结果将自动更新和显示。据我了解,这可
我正在使用 ScalaFX GUI 和 Akka 远程处理网络制作多人游戏客户端。当我的客户端收到游戏数据时,它会将其存储在 Model.gameData 中。我需要我的 GUI 来响应这个变量变化。
我正在使用 OWL API 和 Java (Eclipse) 开发一种算法。对于我的 ASSOCIATION 案例,我需要创建一个公理,其中 AGGREGATION 和 COMPOSITION 作为
我想了解 ObjectProperty 的工作原理,但仍然没有成功。我有以下 POJO: public class Article{ private LocalDateTime dateTim
我有一个包装 ObservableList 的属性。但我不知道如何初始化它。目前我正在这样做 ObjectProperty> property = new ChoiceBox().itemsPrope
我有这个人物 TableView :
我扩展了 SimpleObjectProperty创建自定义延迟加载实现(see here),LazyLoadingObjectProperty . 要将此通用实现用于 boolean 属性,我使用
在 W3 OWL 规范中,个体的属性分为两组:数据类型属性和对象属性。定义了对象属性(正如我发现的一篇文章所说的那样): "Object properties (owl:ObjectProperty)
ObjectPropertyBase 在 newValue == oldValue 时跳过值失效: /** * {@inheritDoc} */ @Override public void set
在RDF中,语句用S、P和O表示;在 OWL 中,owl:ObjectProperty 表示谓词逻辑。 (S) (P) (O) I like dog
我正在尝试创建一条指向属性中节点的线: ObjectProperty pointedToNode = new SimpleObjectProperty(); 我想要一条线像这样指向它: line.en
我正在尝试加载 ontology在 Protégé 中,但未按预期进行处理。最有问题的是所有对象和数据属性都显示为注释,而不是数据属性和对象属性。 我有一个对象属性kingdom: king
我研究了一些类及其声明,发现了一种新的封装方式,它使得访问实例变量的普通 getter/setter 方式看起来像野蛮行为...... 内部javafx.scene.Scene搜索相机,javafx.
我是一名优秀的程序员,十分优秀!