2015-01-08 40 views
1

我跟随了很多链接,并找到了在表视图中显示复选框的解决方案。但我无法在表格视图中更改复选框的值。JavaFX TableView中的属性绑定不起作用

链接我也跟着: How to add CheckBox's to a TableView in JavaFX

模型类:

public class TUser { 
    private SimpleStringProperty name; 
    private SimpleStringProperty address; 
    private SimpleBooleanProperty active; 

public TUser(String name, String address, boolean active) { 
    this.name = new SimpleStringProperty(name); 
    this.address = new SimpleStringProperty(address); 
    this.active = new SimpleBooleanProperty(active); 
} 

public String getName() { 
    return name.get(); 
} 

public void setName(String name) { 
    this.name = new SimpleStringProperty(name); 
} 

public String getAddress() { 
    return address.get(); 
} 

public void setAddress(String address) { 
    this.address = new SimpleStringProperty(address); 
} 

public boolean getActive() { 
    return active.get(); 
} 

public void setActive(boolean active) { 
    this.active = new SimpleBooleanProperty(active); 
} 

} 

FXML文件:

<TableView fx:id="usertable" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
    <columns> 
     <TableColumn fx:id="name" prefWidth="142.0" text="Name" /> 
    <TableColumn fx:id="address" prefWidth="147.0" text="Address" /> 
     <TableColumn fx:id="active" prefWidth="153.0" text="Active" /> 
    </columns> 
    <columnResizePolicy> 
     <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 
    </columnResizePolicy> 
</TableView> 

控制器类:

public class UserManagement extends AnchorPane { 

    @FXML 
    private TableView<TUser> usertable; 
    @FXML 
    private TableColumn<TUser, String> address; 
    @FXML 
    private TableColumn<TUser, String> name; 
    @FXML 
    private TableColumn<TUser, Boolean> active; 

    public UserManagement() throws IOException { 
     initGraphics(); 
     initTable(); 
    } 

    private class CheckBoxCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 
    @Override public TableCell<S, T> call(TableColumn<S, T> p) { 
     return new CheckBoxTableCell<>(); 
    } 
} 

    private void initGraphics() throws IOException { 
     FXMLLoader content = new FXMLLoader(getClass().getResource("/mypack/fxmls/UserManagement.fxml")); 
     content.setController(this); 
     Node contentnode = (Node) content.load(); 
     AnchorPane.setBottomAnchor(contentnode, 0.0); 
     AnchorPane.setLeftAnchor(contentnode, 0.0); 
     AnchorPane.setRightAnchor(contentnode, 0.0); 
     AnchorPane.setTopAnchor(contentnode, 0.0); 
     getChildren().add(contentnode); 

     active.setCellFactory(new CheckBoxCellFactory<TUser, Boolean>()); 

     address.setCellValueFactory(new PropertyValueFactory<TUser, String>("address")); 
     name.setCellValueFactory(new PropertyValueFactory<TUser, String>("name")); 
     active.setCellValueFactory(new PropertyValueFactory<TUser, Boolean>("active")); 

    } 

    private void initTable(){ 
     ObservableList<TUser> data = FXCollections.observableArrayList(new TUser("ABC", "ABC Road", true)); 
     usertable.setItems(data); 
    } 

} 

输出:

TableView

回答

1

为了使复选框正确绑定到模型类的属性,你需要定义一个属性访问方法:

public class TUser { 

    // other methods and fields as before.... 

    public BooleanProperty activeProperty() { 
     return active ; 
    } 

} 

这可能是一个好主意,定义类似的方法也适用于您的其他属性。

请注意,您的表格不可编辑,所以复选框无法由用户操作。如果你想他们是编辑,然后进行TableView编辑:

<TableView fx:id="usertable" editable="true" ...> 

TableColumn S被默认编辑。

+0

但我不想让它可编辑。我只想显示数据,以便用户不能编辑它。 –

+0

啊,好的。 (通过“我无法更改复选框的值”我明白你希望用户能够改变它们,我的错误。)只需定义属性访问器方法,它将正确绑定到属性。 –

+0

相应地更新了答案。 –