JavaFx Tableview复选框需要关注

时间:2018-11-18 14:05:56

标签: javafx checkbox tableview

我在tableView中将布尔表示形式实现为复选框。通常,它可以正常工作,但非常令人烦恼的事实是,它要求将行聚焦(编辑)以应用复选框值的更改。这意味着我首先必须双击该字段,然后单击复选框。

如何使复选框更改立即在onEditCommit上执行?

public class BooleanCell<T> extends TableCell<T, Boolean> {
private CheckBox checkBox;

public BooleanCell() {
    checkBox = new CheckBox();
    checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if (isEditing())
                commitEdit(newValue == null ? false : newValue);
        }
    });
    setAlignment(Pos.CENTER);
    this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    this.setEditable(true);
}

@Override
public void updateItem(Boolean item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setGraphic(null);
    } else {
        checkBox.setSelected(item);
        setGraphic(checkBox);
    }
}

}

1 个答案:

答案 0 :(得分:1)

我不确定其余的实现,但是我假设您没有将TableView设置为可编辑:

tableView.setEditable(true);

附带说明,您可以轻松地使用CheckBoxTableCell而不是自己实现(BooleanCell)。

这是一个非常简单的应用程序,您可以运行该应用程序以查看其工作原理。可以单击每个CheckBox,而无需先关注该行,它的值也会更新您的基础模型(您可以通过单击“打印列表”按钮来看到它)。

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class CheckBoxTableViewSample extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // List of sample items
        ObservableList<MyItem> myItems = FXCollections.observableArrayList();
        myItems.addAll(
                new MyItem(false, "Item 1"),
                new MyItem(false, "Item 2"),
                new MyItem(true, "Item 3"),
                new MyItem(false, "Item 4"),
                new MyItem(false, "Item 5")
        );

        // Create TableView
        TableView<MyItem> tableView = new TableView<MyItem>();

        // We need the TableView to be editable in order to allow each CheckBox to be selectable
        tableView.setEditable(true);

        // Create our table Columns
        TableColumn<MyItem, Boolean> colSelected = new TableColumn<>("Selected");
        TableColumn<MyItem, String> colName = new TableColumn<>("Name");

        // Bind the columns with our model's properties
        colSelected.setCellValueFactory(f -> f.getValue().selectedProperty());
        colName.setCellValueFactory(f -> f.getValue().nameProperty());

        // Set the CellFactory to use a CheckBoxTableCell
        colSelected.setCellFactory(param -> {
            return new CheckBoxTableCell<MyItem, Boolean>();
        });

        // Add our columns to the TableView
        tableView.getColumns().addAll(colSelected, colName);

        // Set our items to the TableView
        tableView.setItems(myItems);

        // Create a button to print out our list of items
        Button btnPrint = new Button("Print List");
        btnPrint.setOnAction(event -> {
            System.out.println("-------------");
            for (MyItem item : myItems) {
                System.out.println(item.getName() + " = " + item.isSelected());
            }
        });

        root.getChildren().addAll(tableView, btnPrint);
        // Show the Stage
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

/**
 * Just a simple sample class to display in our TableView
 */
final class MyItem {

    // This property will be bound to the CheckBoxTableCell
    private final BooleanProperty selected = new SimpleBooleanProperty();

    // The name of our Item
    private final StringProperty name = new SimpleStringProperty();

    public MyItem(boolean selected, String name) {
        this.selected.setValue(selected);
        this.name.set(name);
    }

    public boolean isSelected() {
        return selected.get();
    }

    public BooleanProperty selectedProperty() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected.set(selected);
    }

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

    public StringProperty nameProperty() {
        return name;
    }

    public void setName(String name) {
        this.name.set(name);
    }
}