使用fxml在JavaFx的TableView中启用复选框

时间:2018-07-30 19:07:14

标签: javafx

我创建了一个表格视图,将其与我的模型链接起来,并放入fxml中,如下所示:

Main.java

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("table.fxml"));
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}
}

Controller.java

public class Controller {
@FXML
private javafx.scene.control.TableView<TableView> tableView;

@FXML
public void initialize() {
    ObservableList<TableView> data = tableView.getItems();
    data.add(new TableView("Item1", true));
    data.add(new TableView("Item2", false));
}
}

TableView.java

public class TableView {

private SimpleStringProperty text;
private SimpleBooleanProperty check;

TableView(String text, boolean check) {
    this.text = new SimpleStringProperty(text);
    this.check = new SimpleBooleanProperty(check);
}

public boolean getCheck() {
    return check.get();
}

public SimpleBooleanProperty checkProperty() {
    return check;
}

public void setCheck(boolean check) {
    this.check.set(check);
}

public String getText() {
    return text.get();
}

public SimpleStringProperty textProperty() {
    return text;
}

public void setText(String text) {
    this.text.set(text);
}
}

CheckBoxTableCellFactory.java

public class CheckBoxTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
public TableCell<S, T> call(TableColumn<S, T> param) {
    return new CheckBoxTableCell<>();
}
}

table.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>

<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import table.CheckBoxTableCellFactory?>

<VBox prefHeight="600.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="table.Controller">
    <SplitPane focusTraversable="true" VBox.vgrow="ALWAYS">
        <Pane prefHeight="200.0" prefWidth="200.0">
            <TableView fx:id="tableView" layoutX="6.0" layoutY="4.0" prefHeight="406.0" prefWidth="694.0">
                <columns>
                    <TableColumn prefWidth="75.0" text="Check">
                        <cellValueFactory>
                            <PropertyValueFactory property="check" />
                        </cellValueFactory>
                        <cellFactory>
                            <CheckBoxTableCellFactory />
                        </cellFactory>
                    </TableColumn>
                    <TableColumn prefWidth="200.0" text="Text">
                        <cellValueFactory>
                            <PropertyValueFactory property="text"/>
                        </cellValueFactory>
                    </TableColumn>
                </columns>
            </TableView>
        </Pane>
    </SplitPane>
</VBox>

我看起来不错- screenshot

但复选框已禁用-我无法选中/取消选中它们。当我单击它们时,它们不会更改其状态(选中/未选中)。如何解决?

1 个答案:

答案 0 :(得分:1)

默认情况下,TableView是不可编辑的,这意味着TableView中的任何自定义控件也会被禁用。

您可以通过将TableView的FXML定义更新为包括editable="true"或在控制器中使用tableView.setEditable(true);来启用编辑。