[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);

获取选中的表格行

// 获取选中的行序号
tableView.getSelectionModel().getSelectedIndex();

// 获取选中的行数据
tableView.getSelectionModel().getSelectedItem();

// 获取选中的多行数据
tableView.getSelectionModel().getSelectedItems();

// 取消选择
tableView.getSelectionModel().clearSelection();

监听选中行的变化

// 获取选中的多行数据
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);
  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 JavaFXTableView 控件,你可以按照以下步骤进行操作: 1. 导入必要的 JavaFX 类: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; ``` 2. 创建 TableView 和相关的 TableColumn 对象: ```java TableView<YourDataClass> tableView = new TableView<>(); TableColumn<YourDataClass, String> column1 = new TableColumn<>("Column 1"); TableColumn<YourDataClass, Integer> column2 = new TableColumn<>("Column 2"); // ... ``` 3. 设置 TableView 的数据源(items): ```java ObservableList<YourDataClass> dataList = FXCollections.observableArrayList(); // 添加数据到 dataList tableView.setItems(dataList); ``` 4. 设置 TableColumn 的单元格值提供器(CellValueFactory): ```java column1.setCellValueFactory(new PropertyValueFactory<>("property1")); column2.setCellValueFactory(new PropertyValueFactory<>("property2")); // ... ``` 其中,"property1" 和 "property2" 是 YourDataClass 中的属性名称,用于获取对应列的数据。 5. 可选:设置 TableColumn 的单元格工厂(CellFactory)来自定义单元格的显示方式。 6. 将 TableColumn 添加到 TableView 中: ```java tableView.getColumns().add(column1); tableView.getColumns().add(column2); // ... ``` 7. 创建 Scene 并将 TableView 放入其中: ```java Scene scene = new Scene(tableView); ``` 8. 创建 Stage 并设置 Scene: ```java Stage stage = new Stage(); stage.setScene(scene); stage.show(); ``` 通过以上步骤,你就可以创建一个基本TableView,并在其中显示和操作表格数据了。你可以根据自己的需求,进一步设置 TableView 的其他属性和方法,以满足更复杂的功能要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值