JAVAFX中的表格显示主要使用TableView
与TableView相关的类:
TableColumn
TableRow
TableCell
TablePosition
TableViewFocusModel
TableViewSelectionModel
JavaFX TableView例子:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.SelectionMode;
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;/*** TableView示例** @author Raygo* @since 2022年3月2日*/
public class TableViewExample extends Application {/*** 启动** @param args 参数*/public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {// 创建一个表格视图TableView<Person> tableView = new TableView<>();// 创建列TableColumn<Person, String> column1 = new TableColumn<>("姓名");column1.setCellValueFactory(new PropertyValueFactory<>("Name"));TableColumn<Person, String> column2 = new TableColumn<>("年龄");column2.setCellValueFactory(new PropertyValueFactory<>("age"));// 设置列宽column1.setPrefWidth(120.0d);column2.setPrefWidth(200.0d);// 添加列tableView.getColumns().add(column1);tableView.getColumns().add(column2);// tableView.getColumns().addAll(column1, column2);// 无行数据显示时的占位符tableView.setPlaceholder(new Label("空白"));Button addLine = new Button("添加行");addLine.setOnMouseClicked((event) -> {// 添加行数据tableView.getItems().add(new Person("张三", 15));tableView.getItems().add(new Person("李四", 22));});Button singleSelect = new Button("单选模式");singleSelect.setOnMouseClicked((event) -> {// 设置选择模式为单行tableView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);});Button multiSelect = new Button("多选模式");multiSelect.setOnMouseClicked((event) -> {// 设置多行选择模式tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);});// 界面HBox topBar = new HBox();topBar.getChildren().addAll(addLine, singleSelect, multiSelect);VBox body = new VBox(tableView);VBox vbox = new VBox();vbox.getChildren().addAll(topBar, body);Scene scene = new Scene(vbox);primaryStage.setScene(scene);primaryStage.setWidth(480.0d);primaryStage.setHeight(320.0d);primaryStage.show();}public class Person {private String name;private int age;public Person(String name, int age) {this.setName(name);this.setAge(age);}/*** Get age value** @return the age*/public int getAge() {return age;}/*** Set age to age** @param age the age to set*/public void setAge(int age) {this.age = age;}/*** Get name value** @return the name*/public String getName() {return name;}/*** Set name to name** @param name the name to set*/public void setName(String name) {this.name = name;}}
}
单元格值工厂
TableColumn必须设置单元格值工厂,提取要显示在列中的每个单元格(每行)中的值。在上面的例子中使用了PropertyValueFactory。PropertyValueFactory工厂可以从Java对象中提取一个属性值(字段值)。属性名作为参数传递给PropertyValueFactory构造函数,如下所示:
PropertyValueFactory factory = new PropertyValueFactory<>("firstName");
属性名firstName将与Person对象的getter getter方法getFirstName()相匹配,Person对象包含每行显示的值。
占位符
当JavaFX TableView没有显示行时,可以设置一个占位符来显示。占位符必须是JavaFX Node类的一个实例,大多数(如果不是全部)JavaFX控件都是这样的。因此,您可以使用JavaFX ImageView或JavaFX Label作为占位符,例如:
tableView.setPlaceholder(new Label("空白"));
下面是相应的TableView在显示占位符后的样子:
设置表格行的选择模式
你可以使用setSelectionMode()方法来设置TableView TableViewSelectionModel的选择模式:
// 设置选择模式为单行
tableView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);// 设置多行选择模式
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
获取选中的表格行
// 获取选中的多行数据
ObservableList<Person> selectedItems = tableView.getSelectionModel().getSelectedItems();// 监听选中行的变化
selectedItems.addListener(new ListChangeListener<Person>() {@Overridepublic void onChanged(Change<? extends Person> change) {System.out.println("Selection changed: " + change.getList());}
});
列的排序
// 使能排序
column0.setSortable(true);
// 禁用排序
column0.setSortable(false);
// 排序类型设置为升序
column0.setSortType(TableColumn.SortType.ASCENDING);
// 排序类型设置为降序
column0.setSortType(TableColumn.SortType.DESCENDING);
序号列
TableColumn<Person, String> column0 = new TableColumn<>("序号");
column0.setCellFactory((tableColumn) -> {TableCell<Person, String> tableCell = new TableCell<>() {@Overrideprotected void updateItem(String item, boolean empty) {super.updateItem(item, empty);this.setText(null);this.setGraphic(null);if (!empty) {this.setText(String.valueOf(this.getIndex() + 1));}}};return tableCell;
});
添加列
tableView.getColumns().add(0, column0);