Add two button in one column and get the click row

2019-08-09 17:47发布

问题:

I am trying to implement two button in one column in table view in javafx . I, am able to implement one button in one column but not able to add two button in one column . I got some idea from this link

How to add button in JavaFX table view

Add a button to a cells in a TableView (JAVAFX)

How to add two buttons in a TableColumn of TableView JavaFX

I have use the idea in the link above. However, the code is not working for me.

    TableColumn<Student, String> firstCol = new TableColumn<Student, String>("ID");
    TableColumn<Student, String> secondCol = new TableColumn<Student, String>("Name");
    TableColumn<Student, String> thirdCol = new TableColumn<Student, String>("Quiz Mark");
    TableColumn<Student, String> forthCol = new TableColumn<Student, String>("A1");
    TableColumn<Student, String> fifthCol = new TableColumn<Student, String>("A2");
    TableColumn<Student, String> sixthCol = new TableColumn<Student, String>("A3");
    TableColumn<Student, String> sevenCol = new TableColumn<Student, String>("Exam");
    TableColumn<Student, String> eightCol = new TableColumn<Student, String>("Result");
    TableColumn<Student, String> nineCol = new TableColumn<Student, String>("Grade");
    TableColumn<Student, Student> tenthCol = new TableColumn<Student, Student>("Action");   


firstCol.setCellValueFactory(new PropertyValueFactory<>("Id"));
    secondCol.setCellValueFactory(new PropertyValueFactory<>("Name"));
    thirdCol.setCellValueFactory(new PropertyValueFactory<>("QuizMark"));
    forthCol.setCellValueFactory(new PropertyValueFactory<>("Assingment1Mark"));
    fifthCol.setCellValueFactory(new PropertyValueFactory<>("Assingment2Mark"));
    sixthCol.setCellValueFactory(new PropertyValueFactory<>("Assingment3Mark"));
    sevenCol.setCellValueFactory(new PropertyValueFactory<>("ExamMark"));
    eightCol.setCellValueFactory(new PropertyValueFactory<>("Result"));
    nineCol.setCellValueFactory(new PropertyValueFactory<>("Grade"));
    tenthCol.setCellFactory(param -> new TableCell<Student, Student>() {
        private final Button editButton = new Button("edit");
        private final Button deleteButton = new Button("delete");
        HBox pane = new HBox(deleteButton, editButton);

        @Override
        protected void updateItem(Student patient, boolean empty) {
            super.updateItem(patient, empty);

            if (patient == null) {
                setGraphic(null);
                return;
            }

            deleteButton.setOnAction(event -> {
                Student getPatient = getTableView().getItems().get(getIndex());
                System.out.println(getPatient.getId() + "   " + getPatient.getName());
            });

            editButton.setOnAction(event -> {
                Student getPatient = getTableView().getItems().get(getIndex());
            });
            pane.getChildren().addAll(deleteButton,editButton);
            setGraphic(pane);
        }
    });

In, the action column buttons doesn't appears. Where am I doing mistake. Please anyone let me know.

回答1:

Lacking a cellValueFactory the item for cells in tenthColumn is always null. Use the second argument of the updateItem method to determine if the row is empty or not.

Also to indicate this I'd change the type of the column to TableColumn<Student, Void>.

Furthermore adding the children of the HBox again every time the item is changed is unnecessary as is updating the onAction handlers, since getIndex() is evaluated at the time the Button is clicked.

You could change the code to this:

TableColumn<Student, Void> tenthCol = new TableColumn<>("Action");

...

tenthCol.setCellFactory(param -> new TableCell<Student, Void>() {
    private final Button editButton = new Button("edit");
    private final Button deleteButton = new Button("delete");
    private final HBox pane = new HBox(deleteButton, editButton);

    {
        deleteButton.setOnAction(event -> {
            Student getPatient = getTableView().getItems().get(getIndex());
            System.out.println(getPatient.getId() + "   " + getPatient.getName());
        });

        editButton.setOnAction(event -> {
            Student getPatient = getTableView().getItems().get(getIndex());
        });
    }

    @Override
    protected void updateItem(Void item, boolean empty) {
        super.updateItem(item, empty);

        setGraphic(empty ? null : pane);
    }
});