JAVAFX的TableView基本用法

Posted 浪子尘晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVAFX的TableView基本用法相关的知识,希望对你有一定的参考价值。

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);
    
 
    @Override
    public 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>() 
    @Override
    public 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<>() 
		@Override
		protected 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);

以上是关于JAVAFX的TableView基本用法的主要内容,如果未能解决你的问题,请参考以下文章

javaFX tableView中嵌入

JavaFX 2 TableView:根据单元格内的数据不同的单元格工厂

无法将值插入 tableview - JavaFx

没有对象的 TableView 中的组合框 - JavaFX

JavaFX 9/10 不再可能覆盖 TableView.resizeColumnToFitContent

JavaFX - 使 TableView 高度适应行数