JavaFX高级组件之TableView

JavaFX高级组件之TableView


  • 先整体说说

使用 TableView 控件时,其重点不在于显示图形界面,而在于界面上展示数据与后台数据的动态绑定!
一般使其能够动态更新需要有两个条件:
1. 使用 TableViewObservableList<T> 的双向绑定。ObservableList<T> 是JavaFX结合框架下的实现类。类似于普通集合类,但是它是允许跟踪更改的列表,可以与 util 包下的集合互相转换。
2. 使用具有 Property 属性的数据封装。


  • 如何在布局中添加TableView

    1. 创建 TableView 实例和 ObservableList<T> 实例,代码如下:
public  TableView<DataEntry> table = new TableView<DataEntry>();
public  ObservableList<DataEntry> data = FXCollections.observableArrayList(list);//FXCollection和UnitCollection的转换
//list为ArrayList集合,通过FXCollection对象可以实现转换

Collection和FXCollection的互相转换:

ArrayList<DataEntry> dataList = new ArrayList<DataEntry>(ObservableList<Data> data);
ObservableList<DataEntry> data = FXCollections.observableArrayList(list);
  1. 创建 TableColumn (列实例),绑定数据模型,添加到表格
TableColumn<DataEntry, String> dataNameCol = new TableColumn<DataEntry, String>("Data Name");//定义列
dataNameCol.setMinWidth(100);//设置列的最小宽度
dataNameCol.setCellValueFactory(new PropertyValueFactory<>("dataName"));//将列与数据模型中的数据属性绑定

table.setItems(data);//table 和 ObservableList 数据绑定
table.getColumns().addAll(selectedCol,dataNameCol, dataValueCol);//绑定创建的列到表格

至此,一个表格视图就快要创建完成了,还有最重要的一点,特殊的数据封装!一下代码为本例中 DataEntry 数据模型的实现:

import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;

public class DataEntry {
    private final SimpleStringProperty dataName;
    private final SimpleDoubleProperty dataValue;

    public DataEntry(String dataName, Double dataValue) {
        this.dataName = new SimpleStringProperty(dataName);
        this.dataValue = new SimpleDoubleProperty(dataValue);
    }

     public String getDataName() {
         return dataName.get();
     }
     public void setDataName(String dName) {
         dataName.set(dName);
     }
     public SimpleStringProperty dataNameProperty(){
            return dataName;
     }

     public Double getDataValue() {
         return dataValue.get();
     }
     public void setDataValue(Double dValue) {
         dataValue.set(dValue);
     }
     public SimpleDoubleProperty dataValueProperty(){
            return dataValue;
     }
}

在确保以上条件正确的情况下,一个可以动态更新数据的表格就完成了。效果如下图:

][表格视图

如上图,在表格中添加类似单选框的组件是怎么做到的呢?


  • 自定义表格单元格

    1. 使单元格可编辑,代码如下:
dataNameCol.setCellFactory(TextFieldTableCell.<DataEntry>forTableColumn());//将 dataNameCol 列的单元格定义为 TextFieldTableCell
dataNameCol.setOnEditCommit((CellEditEvent<DataEntry,String> t) -> { //创建单元格被修改事件
    ((DataEntry) t.getTableView().getItems().get(t.getTablePosition().getRow())).setDataName(t.getNewValue()); //将新的值赋给获取到的单元格
});
  1. 在单元中加入 CheckBox 单选框:
TableColumn<DataEntry,Boolean> selectedCol = new TableColumn<DataEntry, Boolean>("Check");//定义列
selectedCol.setMinWidth(50);
selectedCol.setCellValueFactory(new PropertyValueFactory<>("selected"));

selectedCol.setCellFactory(new Callback<TableColumn<DataEntry, Boolean>, TableCell<DataEntry, Boolean>>() {
    @Override
    public TableCell<DataEntry, Boolean> call(
        TableColumn<DataEntry, Boolean> param) {
        CheckBoxTableCell<DataEntry, Boolean> cell = new CheckBoxTableCell<>();
        cell.setAlignment(Pos.CENTER);
        return cell;
    }
});
selectedCol.setOnEditCommit((CellEditEvent<DataEntry,Boolean> t) -> {
    ((DataEntry) t.getTableView().getItems().get(t.getTablePosition().getRow())).setSelected(t.getNewValue());
});

当然在数据模型封装中,也要为 单选框 这一列建立一个 SimpleBooleanProperty 的绑定属性。

private SimpleBooleanProperty selected = new SimpleBooleanProperty(false);

public Boolean getSelected() {
    return selected.get();
}
public void setSelected(Boolean flag) {
    selected.set(flag);
} 
public SimpleBooleanProperty selectedProperty(){
    return selected;
}

效果图

这里写图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值