选中的复选框将 select 整行删除

Selected checkbox will select entire row for delete

我是 JavaFX 的新手。我创建了这段代码,但我不知道如何在单击复选框时 select 整行。

我已经实现了单击行时的删除功能(如果 selected)。但现在我还想添加复选框 selection。

我注意到的一件事是,当我删除该行时,下一个复选框会自动 selected。

我的代码在这里:

package com.wf.sapphire.client.feature.cls;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.util.Callback;

import javax.inject.Inject;

import com.wf.sapphire.client.javafx.ViewModelControllerBase;

public class ClsMainController extends ViewModelControllerBase<ClsMainViewModel> {

    @Inject
    protected ClsMainController(final ClsMainViewModel clsMainViewModel) {      
        super(clsMainViewModel);
    }

    @FXML
    public ComboBox<String> clsComboData;
    @FXML
    public StackPane statckPaneId;  
    @FXML
    private TableView<Person> tblViewer = new TableView();
    @FXML
    public Button delBtn;
    @FXML
    Parent root;

    private final TableView<Person> table = new TableView<>();
    final ObservableList<Person> data = FXCollections.observableArrayList(
            new Person(true, "Jacob", "Smith", "jacob.smith@example.com"),
            new Person(true, "Isabella", "Johnson", "isabella.johnson@example.com"),
            new Person(true, "Ethan", "Williams", "ethan.williams@example.com"),
            new Person(true, "Emma", "Jones", "emma.jones@example.com"),
            new Person(true, "Michael", "Brown", "michael.brown@example.com")
        );

    public void initialize() {
        //Set<Person> selection = new HashSet<Person>(tblViewer.getSelectionModel().getSelectedItems());
        /*System.out.println("\n In the initialize \n");
        System.out.println("READ");
        System.out.println(this.getClass().getSimpleName() + ".initialize");*/ 
    }


    @FXML
    private void onSubmitHandler(ActionEvent event) {

        System.out.println(clsComboData.getValue());
        System.out.println("Button Pressed");


        //"Invited" column
        TableColumn invitedCol = new TableColumn<Person, Boolean>();

        invitedCol.setText("Invited");

        invitedCol.setMinWidth(50);

        invitedCol.setCellValueFactory(new PropertyValueFactory("invited"));
        // Create checkboxes
        invitedCol.setCellFactory(new Callback<TableColumn<Person, Boolean>, TableCell<Person, Boolean>>() {
            public TableCell<Person, Boolean> call(TableColumn<Person, Boolean> p) {
                //System.out.println("Checkbox Pressed");
                //private TableView<Person> tblViewer = new TableView();
                CheckBoxTableCell<Person, Boolean> checkBox = new CheckBoxTableCell();

                return checkBox;

            }
        });              

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));

        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));

        TableColumn emailNameCol = new TableColumn("Email");
        emailNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));

        //Set cell factory for cells that allow editing
        Callback<TableColumn, TableCell> cellFactory =
                new Callback<TableColumn, TableCell>() {
            public TableCell call(TableColumn p) {

                return new EditingCell();

            }
        };
        emailNameCol.setCellFactory(cellFactory);
        firstNameCol.setCellFactory(cellFactory);
        lastNameCol.setCellFactory(cellFactory);

        //Set handler to update ObservableList properties. Applicable if cell is edited        
        updateObservableListProperties(emailNameCol, firstNameCol, lastNameCol);

        // Clear the tableview for next table
        tblViewer.getColumns().clear();
        // Push the data to the tableview
        tblViewer.setItems(data);
        tblViewer.setEditable(true);
        // Add the columns
        tblViewer.getColumns().addAll(invitedCol,firstNameCol, lastNameCol,emailNameCol);
        tblViewer.getSelectionModel().setCellSelectionEnabled(true);


        CheckBox cb = new CheckBox("Select all");
        cb.selectedProperty().addListener(new ChangeListener<Boolean>() {
            public void changed(ObservableValue<? extends Boolean> ov,
                    Boolean old_val, Boolean new_val) {
                if (new_val) {
                    for (Person p : data) {
                        p.invited.set(true);
                    }

                }


            }
        });        
        //tblViewer.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);        
    }

    @FXML
    private void onDeleteHandler(ActionEvent event){

        data.removeAll(tblViewer.getSelectionModel().getSelectedItems());
        tblViewer.getSelectionModel().clearSelection();

    }


    public static class Person {
        private final BooleanProperty invited;
        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;
        private final SimpleStringProperty email;

        private Person(boolean invited, String fName, String lName, String email) {
            this.invited = new SimpleBooleanProperty(invited);
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);

            this.invited.addListener(new ChangeListener<Boolean>() {
                public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {

                    System.out.println(getFirstName() + " invited: " + t1);

                }
            });
        }

        public boolean getInvited() {
            return invited.get();
        }   

        public String getFirstName() {
            return firstName.get();
        }
        public void setFirstName(String fName) {
            firstName.set(fName);
        }

        public String getLastName() {
            return lastName.get();
        }
        public void setLastName(String fName) {
            lastName.set(fName);
        }

        public String getEmail() {
            return email.get();
        }
        public void setEmail(String fName) {
            email.set(fName);
        }

    }

    private void updateObservableListProperties(TableColumn emailCol, TableColumn firstNameCol,
            TableColumn lastNameCol) {
        //System.out.println("updateObservableListProperties");
        //Modifying the email property in the ObservableList

        emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                //System.out.println("setOnEditCommit");
                ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setEmail(t.getNewValue());

            }
        });

        //Modifying the firstName property in the ObservableList

        firstNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                //  System.out.println("firstNameCol");
                ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setFirstName(t.getNewValue());

            }
        });

        //Modifying the lastName property in the ObservableList

        lastNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                //  System.out.println("lastNameCol");
                ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setLastName(t.getNewValue());

            }
        });

    }
  //CheckBoxTableCell for creating a CheckBox in a table cell
    public static class CheckBoxTableCell<S, T> extends TableCell<S, T> {

        private final CheckBox checkBox;
        private ObservableValue<T> ov;

        public CheckBoxTableCell() {
            //System.out.println("CheckBoxTableCell");
            this.checkBox = new CheckBox();

            this.checkBox.setAlignment(Pos.CENTER);

            setAlignment(Pos.CENTER);

            setGraphic(checkBox);

        }

        @Override
        public void updateItem(T item, boolean empty) {
            //System.out.println("updateItem");
            super.updateItem(item, empty);

            if (empty) {

                setText(null);

                setGraphic(null);

            } else {

                setGraphic(checkBox);

                if (ov instanceof BooleanProperty) {

                    checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);

                }

                ov = getTableColumn().getCellObservableValue(getIndex());

                if (ov instanceof BooleanProperty) {

                    checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);

                }

            }

        }
    }

    // EditingCell - for editing capability in a TableCell
    public static class EditingCell extends TableCell<Person, String> {

        private TextField textField;

        public EditingCell() {
            //System.out.println("EditingCell");
        }

        @Override
        public void startEdit() {
            //System.out.println("startEdit");
            super.startEdit();



            if (textField == null) {

                createTextField();

            }

            setText(null);

            setGraphic(textField);

            textField.selectAll();

        }

        @Override
        public void cancelEdit() {
            //System.out.println("cancelEdit");
            super.cancelEdit();

            setText((String) getItem());

            setGraphic(null);

        }

        @Override
        public void updateItem(String item, boolean empty) {
            //System.out.println("updateItem");
            super.updateItem(item, empty);

            if (empty) {

                setText(null);

                setGraphic(null);

            } else {

                if (isEditing()) {

                    if (textField != null) {

                        textField.setText(getString());

                    }

                    setText(null);

                    setGraphic(textField);

                } else {

                    setText(getString());

                    setGraphic(null);

                }

            }

        }

        private void createTextField() {
            //System.out.println("createTextField");
            textField = new TextField(getString());

            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);

            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {

                    if (t.getCode() == KeyCode.ENTER) {

                        commitEdit(textField.getText());

                    } else if (t.getCode() == KeyCode.ESCAPE) {

                        cancelEdit();

                    }

                }
            });

        }

        private String getString() {
            //System.out.println("getString");
            return getItem() == null ? "" : getItem().toString();

        }
    }
}

尝试

public CheckBoxTableCell()
{
    //System.out.println("CheckBoxTableCell");
    this.checkBox = new CheckBox();
    this.checkBox.setAlignment( Pos.CENTER );
    setAlignment( Pos.CENTER );

    checkBox.selectedProperty().addListener( new ChangeListener<Boolean>()
    {
        @Override
        public void changed( ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue )
        {
            if ( newValue )
            {
                getTableView().getSelectionModel().select( getIndex() );
            }
            else
            {
                getTableView().getSelectionModel().clearSelection( getIndex() );
            }
        }
    } );

    setGraphic( checkBox );

}