我有一个用于显示的简单Person
对象列表TableView
:
class Person {
private final StringProperty name = new SimpleStringProperty();
private final StringProperty emailAddress = new SimpleStringProperty();
private final StringProperty phoneNumber = new SimpleStringProperty();
public Person(String name, String emailAddress, String phoneNumber) {
this.name.set(name);
this.emailAddress.set(emailAddress);
this.phoneNumber.set(phoneNumber);
}
}
我在此示例中的目标是同时显示emailAddress
和。这不仅仅是在我为此列实现自定义时简单地连接值(实际应用程序更复杂):phoneNumber
TableColumn
TableCell
private TableCell<Person, Person> buildContactCell() {
return new TableCell<Person, Person>() {
final VBox root = new VBox();
final Label lblEmailAddress = new Label();
final Label lblPhoneNumber = new Label();
{
root.getChildren().addAll(lblEmailAddress, lblPhoneNumber);
}
@Override
protected void updateItem(Person person, boolean empty) {
super.updateItem(person, empty);
if (person != null && !empty) {
lblEmailAddress.setText(person.getEmailAddress());
lblPhoneNumber.setText(person.getPhoneNumber());
setGraphic(root);
} else {
setGraphic(null);
}
}
};
}
我假设这工作正常,但我不确定如何配置CellValueFactory
它TableColumn
以接受整个Person
对象。
是否有另一种方法可以设置TableCell
能够访问多个属性Person
?我在实现多个属性时看到的其他问题仅涉及连接,这不是我想要的。
完整代码:
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TableCellSample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple Interface
VBox root = new VBox(10);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10));
root.getChildren().add(getTableView());
// Show the stage
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("Sample");
primaryStage.show();
}
private TableView<Person> getTableView() {
TableView<Person> tableView = new TableView<>();
TableColumn<Person, String> colName = new TableColumn<>("Name");
colName.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
TableColumn<Person, Person> colContact = new TableColumn<>("Contact");
colContact.setCellFactory(cell -> buildContactCell());
// **********************************************************************************************
// Need to set the CellValueFactory for colContact here
// **********************************************************************************************
tableView.getColumns().addAll(colName, colContact);
tableView.setItems(getSampleData());
return tableView;
}
private TableCell<Person, Person> buildContactCell() {
return new TableCell<Person, Person>() {
final VBox root = new VBox();
final Label lblEmailAddress = new Label();
final Label lblPhoneNumber = new Label();
{
root.getChildren().addAll(lblEmailAddress, lblPhoneNumber);
}
@Override
protected void updateItem(Person person, boolean empty) {
super.updateItem(person, empty);
if (person != null && !empty) {
lblEmailAddress.setText(person.getEmailAddress());
lblPhoneNumber.setText(person.getPhoneNumber());
setGraphic(root);
} else {
setGraphic(null);
}
}
};
}
private ObservableList<Person> getSampleData() {
ObservableList<Person> persons = FXCollections.observableArrayList();
persons.addAll(
new Person("Jack", "jack@outlook.com", "123-456-7890"),
new Person("Jenny", "goodtime@yahoo.com", "555-867-5309"),
new Person("Jesse", "mygirl@hotmail.com", "846-989-9988"));
return persons;
}
}
class Person {
private final StringProperty name = new SimpleStringProperty();
private final StringProperty emailAddress = new SimpleStringProperty();
private final StringProperty phoneNumber = new SimpleStringProperty();
public Person(String name, String emailAddress, String phoneNumber) {
this.name.set(name);
this.emailAddress.set(emailAddress);
this.phoneNumber.set(phoneNumber);
}
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
public String getEmailAddress() {
return emailAddress.get();
}
public StringProperty emailAddressProperty() {
return emailAddress;
}
public String getPhoneNumber() {
return phoneNumber.get();
}
public StringProperty phoneNumberProperty() {
return phoneNumber;
}
}