我们可以使用来自 JavaFX API 的 TableView,TableColumn 和 TableCell 类以表格形式表示数据。
通过实现数据模型和应用单元工厂来填充表中的数据。
表类可以按列排序数据,并在必要时调整列大小。
创建表
表控件是通过实例化 TableView 类创建的。
TableView table = new TableView();
table.setEditable(true);
然后使用 TableColumn 类创建三个列。TableView 类的 getColumns 方法将创建的列添加到表中。
TableColumn firstNameCol = new TableColumn("First Name");
TableColumn lastNameCol = new TableColumn("Last Name");
TableColumn emailCol = new TableColumn("Email");
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
我们可以通过调用 setVisible 方法隐藏列。
aColumn.setVisible(false).
以下代码创建一个表。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
TableView table = new TableView();
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
TableColumn lastNameCol = new TableColumn("Last Name");
TableColumn emailCol = new TableColumn("Email");
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
emailCol.setVisible(false);
StackPane root = new StackPane();
root.getChildren().add(table);
primaryStage.setScene(new Scene(root, 200, 250));
primaryStage.show();
}
}
嵌套标头
使用 JavaFX 表视图,我们可以轻松创建嵌套列。
假设我们要将两个子列添加到地址列。
TableColumn cityCol = new TableColumn("City");
TableColumn stateCol = new TableColumn("State");
然后我们将新创建的列添加到地址列。
addressCol.getColumns().addAll(cityCol, stateCol);
完整的源代码
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
TableView table = new TableView();
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
TableColumn lastNameCol = new TableColumn("Last Name");
TableColumn addressCol = new TableColumn("Email");
table.getColumns().addAll(firstNameCol, lastNameCol, addressCol);
TableColumn cityCol = new TableColumn("City");
TableColumn stateCol = new TableColumn("State");
addressCol.getColumns().addAll(cityCol, stateCol);
StackPane root = new StackPane();
root.getChildren().add(table);
primaryStage.setScene(new Scene(root, 200, 250));
primaryStage.show();
}
}
动态添加新行
以下代码显示如何向表视图中添加数据。 创建 JavaFX JavaBean 以保存单个行的值。 表中的每一行代表一个名字为姓氏的人。 JavaFX JavaBean 称为 Person,它有两个字段,名字和姓氏。 Person 为这两个值提供了可绑定的属性。
在 UI 逻辑中,它使用 ObservableList 来保存表视图的值。 ObservableList 中的每个元素都是一个Person对象。
在按钮事件处理程序中,它创建一个新的具有硬编码的名字和姓氏的人,然后添加到 ObservableList。
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFx02 extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root,450,550);
TableView<Person> table = new TableView<>();
ObservableList<Person> data = FXCollections.observableArrayList(new Person("A", "B"));
table.setItems(data);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
table.getColumns().addAll(firstNameCol, lastNameCol);
Button addButton = new Button("Add");
addButton.setOnAction((ActionEvent e) -> {
data.add(new Person("Z","X"));
});
HBox hb = new HBox();
hb.getChildren().addAll(addButton);
hb.setSpacing(3);
VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10));
vbox.getChildren().addAll(table, hb);
root.getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private String firstName;
private String lastName;
public Person(){}
public Person(String firstName,String lastName ){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
}
行中添加按钮、排序
TableView 类具有列的内置排序功能。
aColumn.setSortType(TableColumn.SortType.DESCENDING);
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class JavaFx01 extends Application {
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root,450,550);
TableView<Person> table = new TableView<>();
ObservableList<Person> data =FXCollections.observableArrayList(new Person("A", "B"),new Person("D", "E"));
table.setItems(data);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
TableColumn<Person,String> operationCol = new TableColumn("操作");
lastNameCol.setMinWidth(100);
operationCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
@Override
public TableCell<Person, String> call(TableColumn<Person, String> personStringTableColumn) {
Button btn = new Button("删除");
TableCell<Person,String> cell = new TableCell<Person,String>(){
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
setText(null);
} else {
btn.setOnAction(actionEvent->{
Person person = getTableView().getItems().get(getIndex());
System.out.println(person.firstName);
System.out.println(person.lastName);
System.out.println("删除....");
});
setGraphic(btn);//设置按钮
setText(null);//清空文本
}
}
};
return cell;
}
});
table.getColumns().addAll(firstNameCol, lastNameCol,operationCol);
firstNameCol.setSortType(TableColumn.SortType.DESCENDING);
lastNameCol.setSortable(false);
VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(table);
root.getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private String firstName;
private String lastName;
public Person(){}
public Person(String firstName,String lastName ){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
}