How to add button in JavaFX table view

后端 未结 2 1967
猫巷女王i
猫巷女王i 2020-11-30 04:38

I have searched at Google and Stackoverflow for this and I just don\'t get the given examples. Can someone please explain it to me.

I want to add a button to the la

2条回答
  •  既然无缘
    2020-11-30 05:07

    To be able to render the column, TableColumn needs cellValueFactory. But the "action" column does not exist in underlying data model. In this case, I just give some dummy value to cellValueFactory and move on:

    public class JustDoIt extends Application {
    
        private final TableView table = new TableView<>();
        private final ObservableList data
                = FXCollections.observableArrayList(
                        new Person("Jacob", "Smith"),
                        new Person("Isabella", "Johnson"),
                        new Person("Ethan", "Williams"),
                        new Person("Emma", "Jones"),
                        new Person("Michael", "Brown")
                );
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) {
            stage.setWidth(450);
            stage.setHeight(500);
    
            TableColumn firstNameCol = new TableColumn("First Name");
            firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
    
            TableColumn lastNameCol = new TableColumn("Last Name");
            lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
    
            TableColumn actionCol = new TableColumn("Action");
            actionCol.setCellValueFactory(new PropertyValueFactory<>("DUMMY"));
    
            Callback, TableCell> cellFactory
                    = //
                    new Callback, TableCell>() {
                @Override
                public TableCell call(final TableColumn param) {
                    final TableCell cell = new TableCell() {
    
                        final Button btn = new Button("Just Do It");
    
                        @Override
                        public void updateItem(String item, boolean empty) {
                            super.updateItem(item, empty);
                            if (empty) {
                                setGraphic(null);
                                setText(null);
                            } else {
                                btn.setOnAction(event -> {
                                    Person person = getTableView().getItems().get(getIndex());
                                    System.out.println(person.getFirstName()
                                            + "   " + person.getLastName());
                                });
                                setGraphic(btn);
                                setText(null);
                            }
                        }
                    };
                    return cell;
                }
            };
    
            actionCol.setCellFactory(cellFactory);
    
            table.setItems(data);
            table.getColumns().addAll(firstNameCol, lastNameCol, actionCol);
    
            Scene scene = new Scene(new Group());
    
            ((Group) scene.getRoot()).getChildren().addAll(table);
    
            stage.setScene(scene);
            stage.show();
        }
    
        public static class Person {
    
            private final SimpleStringProperty firstName;
            private final SimpleStringProperty lastName;
    
            private Person(String fName, String lName) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
            }
    
            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);
            }
    
        }
    }
    

提交回复
热议问题