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 2 TableView:根据单元格内的数据不同的单元格工厂
没有对象的 TableView 中的组合框 - JavaFX