【问题标题】:Property bindings in JavaFX TableView are not workingJavaFX TableView 中的属性绑定不起作用
【发布时间】:2015-03-06 21:44:03
【问题描述】:

我跟踪了许多链接并找到了在表格视图中显示复选框的解决方案。但我无法更改表格视图中复选框的值。

我关注的链接: 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);
    }

}

输出:

【问题讨论】:

    标签: java javafx tableview fxml


    【解决方案1】:

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

    public class TUser {
    
        // other methods and fields as before....
    
        public BooleanProperty activeProperty() {
            return active ;
        }
    
    }
    

    为您的其他属性也定义类似的方法可能是个好主意。

    请注意,您的表格不可编辑,因此用户无法操作复选框。如果您希望它们可编辑,则将 TableView 设为可编辑:

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

    TableColumns 默认是可编辑的。

    【讨论】:

    • 但我不想让它可编辑。我只想显示数据,以便用户无法编辑它。
    • 啊,好的。 (通过“我无法更改复选框的值”,我理解您希望用户能够更改它们。我的错误。)只需定义属性访问器方法,它就会正确绑定到属性。跨度>
    • 相应地更新了答案。
    • 是的,它正在工作,但复选框显示有点模糊,如何使其不透明度为 1。我试过这样,私有类 CheckBoxCellFactory 实现 Callback, TableCell> { @Override public TableCell call(TableColumn p) { CheckBoxTableCell cell = new CheckBoxTableCell(); cell.setStyle("-fx-opacity: 1");返回单元格; } 但它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多