2013-04-09 22 views
4

我是JavaFX的新手,请耐心等待。我想要有一个TableView,其中一些列将是复选框。我的意图是将这些绑定到模型对象中的布尔属性。模型对象具有定义为SimpleBooleanProperty的属性,并具有getter/setter和property方法。我已经验证表格“看到”了模型对象,因为我将表格中的某些布尔列绑定为文本,并且果然,表格按预期显示“true”或“false”。但是,我无法使复选框在任一方向绑定数据。我在下面列出了一些示例代码。JavaFX中的Issue binding复选框TableView

public class DataModel { 
    private SimpleBooleanProperty prop1; 
    private SimpleBooleanProperty prop2; 

    public boolean getProp1() { 
    return prop1.get(); 
    } 

    public setProp1(boolean value) { 
    prop1.set(value); 
    } 

    public prop1() { 
    return prop1; 
    } 

    ... 
} 

UI模型的逻辑:

... 
private ObjectProperty<ObservableList<DataModel>> listProperty; 
... 
List<DataModel> list = new ArrayList<DataModel>(); 
... add some DataModel objects to list 

final ObservableList<DataModel> obsList = FXCollections.observableArrayList(list); 
listProperty.set(obsList); 

UI逻辑:

... 
TableView table = new TableView<DataModel>(); 
table.setEditable(true); 

TableColumn<DataModel, String> boolAsStringCol = new TableColumn<DataModel, String>("Prop1"); 
boolAsStringCol.setCellValueFactory(new PropertyValueFactory<DataModel, String>("prop1")); 

TableColumn<DataModel, Boolean> boolAsCbxCol = new TableColumn<DataModel, Boolean>("Prop2"); 
boolAsCbxCol.setCellValueFactory(new PropertyValueFactory<DataModel, Boolean>("prop2")); 
boolAsCbxCol.setCellFactory(CheckBoxTableCell.forTableColumn(boolAsCbxCol)); 
boolAsCbxCol.setEditable(true); 

table.getColumns().add(boolAsStringCol); 
table.getColumns().add(boolAsCbxCol); 
... 

我可以切换复选框,但它似乎并没有被绑定属性的复选框。如果我设置了一个断点,当我选中或取消选中复选框时,setter不会被调用。另外,如果在创建对象时将属性初始化为true,则在呈现表时不会将其显示为已检查。

欢迎任何建议。看起来这应该起作用,但它没有。

谢谢。

+1

我有完全相同的问题,这个代码应该在我看来,但它显然没有。你已经能够解决这个问题了吗? – bashoogzaad 2014-11-23 13:42:28

回答

2

可能是你需要将下面的行添加到您的代码中的DataModel

public SimpleBooleanProperty prop1Property() {return prop1;} 
    public SimpleBooleanProperty prop2Property() {return prop2;} 
+0

这似乎不适用于我,仍然是同样的问题。 – bashoogzaad 2014-11-23 13:42:45

+0

工作了一段时间,现在它工作。我对这个变量仍然有一个getter,并且通常对于例如一个TableView。对于复选框,此代码是必需的。为此+1。 – bashoogzaad 2014-11-24 09:17:20

0

而不是

boolAsCbxCol.setCellFactory(CheckBoxTableCell.forTableColumn(boolAsCbxCol)); 

使用

boolAsCbxCol.setCellFactory(CheckBoxTableCell.forTableColumn(boolAsCbxCol::getCellData)); 

因为您使用了工厂方法实际上是忽略它的论点,这是一个错误https://bugs.openjdk.java.net/browse/JDK-8186287