首页 > 解决方案 > 将复选框添加到 TableView 列

问题描述

我正在重建一个 javafx 桌面应用程序,以应用新功能并从原始代码中删除无用的代码。特别是具有 2 列的过滤列表视图:名称和复选框。

到目前为止,我无法为每一行成功创建复选框,我只能在第二列中显示一个字符串值“false / true”。

将第二列使用的方法从 String 更改为 Boolean 后,我开始遇到编译 PersonTableController.class 的问题...

人物类

package com.genx;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.SimpleBooleanProperty;

public class Person {

    public SimpleStringProperty firstName;
    public SimpleBooleanProperty selected;

    public Person(String firstName, boolean selected) {
        this.firstName = new SimpleStringProperty(firstName);
        this.selected = new SimpleBooleanProperty(selected);
    }

    @SuppressWarnings("unused")
    public String getFirstName() {
       return firstName.get();
    }

    @SuppressWarnings("unused")
    public boolean getSelected() {
       return selected.get();
    }

    @SuppressWarnings("unused")
    public SimpleBooleanProperty selectedProperty() {
      return selected;
    }
}

PersonTablecontroller.class

package com.genx;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.text.Text;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;


/**
 * View-Controller for the person table.
 */
public class PersonTableController {

    @FXML
    Button generate;
    @FXML
    Text status;
    @FXML
    TextField textVorname;
    @FXML
    TextField textNachname;
    @FXML
    TextField textUsergroup;
    @FXML
    TextField adname;
    @FXML
    CheckBox checkbox;
    @FXML
    CheckBox checkbox2;
    @FXML
    TextField filterField;
    @FXML
    TableView<Person> personTable = new TableView<Person>();
    @FXML   
    TableColumn<Person, String> firstNameColumn = new TableColumn<>("Roles Names");
    @FXML   
    TableColumn<Person, Boolean> lastNameColumn = new TableColumn<>("Selected");


    /**
     * Just add some sample data in the constructor.
     */
        ObservableList<Person> masterData = FXCollections.observableArrayList(
new Person("Hans", false), new Person("Ruth", false), new Person("Heinz", false), new Person("Cornelia", false), new Person("Werner", false), new Person("Lydia", false), new Person("Anna", false), new Person("Susan", true), new Person("Joan", false));

@FXML
private void initialize() {
// 0. Initialize the columns.
    personTable.setEditable(true);
    firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
    lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("selected"));
 lastNameColumn.setCellFactory(CheckBoxTableCell.forTableColumn(lastNameColumn));
    lastNameColumn.setEditable(true);
    personTable.getColumns().addAll(firstNameColumn, lastNameColumn);
    personTable.setItems(masterData);

    // 1. Wrap the ObservableList in a FilteredList (initially display all data).
    FilteredList<Person> filteredData = new FilteredList<>(masterData, p -> true);

    // 2. Set the filter Predicate whenever the filter changes.
    filterField.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(person -> {
                // If filter text is empty, display all persons.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                // Compare first name and last name of every person with filter text.
                String lowerCaseFilter = newValue.toLowerCase();

                if (person.getFirstName().toLowerCase().indexOf(lowerCaseFilter) != -1) {
                    return true; // Filter matches first name.
                }
                return false; // Does not match.
            });
        });
        // 3. Wrap the FilteredList in a SortedList. 
        SortedList<Person> sortedData = new SortedList<>(filteredData); 
        // 4. Bind the SortedList comparator to the TableView comparator.       sortedData.comparatorProperty().bind(personTable.comparatorProperty());

        // 5. Add sorted (and filtered) data to the table.
        personTable.setItems(sortedData);
    }

    public void generateImpex() {
        Alert warning = new Alert(AlertType.WARNING, "Generating Impex!", ButtonType.YES, ButtonType.CANCEL);
        warning.showAndWait();
    }
}

在当前状态下,我无法编译控制器,因为它由于某种原因找不到 Person.class ......

如果在 Person.class 中将布尔属性和方法更改为字符串,那么我可以使用 PersonTableController.class 的以下代码编译 jar:

package com.genx;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.text.Text;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;


/**
 * View-Controller for the person table.
 */
public class PersonTableController {

    @FXML
    Button generate;
    @FXML
    Text status;
    @FXML
    TextField textVorname;
    @FXML
    TextField textNachname;
    @FXML
    TextField textUsergroup;
    @FXML
    TextField adname;
    @FXML
    CheckBox checkbox;
    @FXML
    CheckBox checkbox2;
    @FXML
    private TextField filterField;
    @FXML
    private TableView<Person> personTable;
    @FXML
    private TableColumn<Person, String> firstNameColumn;
    @FXML
    private TableColumn<Person, String> lastNameColumn; // TableColumn<Person, Boolean> lastNameColumn;

    private ObservableList<Person> masterData = FXCollections.observableArrayList();

    public PersonTableController() {
        masterData.add(new Person("Hans", "false"));
        masterData.add(new Person("Ruth", "false"));
        masterData.add(new Person("Heinz", "false"));
        masterData.add(new Person("Cornelia", "false"));
        masterData.add(new Person("Werner", "false"));
        masterData.add(new Person("Lydia", "false"));
        masterData.add(new Person("Anna", "false"));
        masterData.add(new Person("Stefan", "false"));
        masterData.add(new Person("Martin", "false"));
        masterData.add(new Person("Joni", "false"));
        masterData.add(new Person("Chachi", "false"));
        masterData.add(new Person("Phillip", "false"));
        masterData.add(new Person("Susan", "true"));
        masterData.add(new Person("Joan", "false"));
    }

    /**
     * Initializes the table columns and sets up sorting and filtering.
     */
    @FXML
    private void initialize() {
        // 0. Initialize the columns.
        firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
        lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
        // 1. Wrap the ObservableList in a FilteredList (initially display all data).
        FilteredList<Person> filteredData = new FilteredList<>(masterData, p -> true);
        // 2. Set the filter Predicate whenever the filter changes.
        filterField.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(person -> {
                // If filter text is empty, display all persons.
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }
                String lowerCaseFilter = newValue.toLowerCase();            
                if (person.getFirstName().toLowerCase().indexOf(lowerCaseFilter) != -1) {
                    return true; // Filter matches first name.
                }
                return false; // Does not match.
            });
        });
        // 3. Wrap the FilteredList in a SortedList. 
        SortedList<Person> sortedData = new SortedList<>(filteredData);

        // 4. Bind the SortedList comparator to the TableView   sortedData.comparatorProperty().bind(personTable.comparatorProperty());

        // 5. Add sorted (and filtered) data to the table.
        personTable.setItems(sortedData);
    }

    public void generateImpex() {
        Alert warning = new Alert(AlertType.WARNING, "Generating Impex!", ButtonType.YES, ButtonType.CANCEL);
        warning.showAndWait();
    }
}

标签: listviewjavafxbooleancheckboxlist

解决方案


推荐阅读