为了能够呈现列,
TableColumn需要cellValueFactory。但是,“操作”列在基础数据模型中不存在。在这种情况下,我只给cellValueFactory一个虚拟值并继续:
public class JustDoIt extends Application { private final TableView<Person> table = new TableView<>(); private final ObservableList<Person> 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<TableColumn<Person, String>, TableCell<Person, String>> cellFactory = // new Callback<TableColumn<Person, String>, TableCell<Person, String>>() { @Override public TableCell call(final TableColumn<Person, String> param) { final TableCell<Person, String> cell = new TableCell<Person, String>() { 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); } }}


