java - 如何将 CellValueFactory 设置为 javafx 中各种属性的函数?
问题描述
我正在以 MVC 模式在 javafx 中构建下载管理器,但遇到了一些麻烦。我想在 TableView 中列出下载,并在各个列中列出所有属性。
假设我有一个这样的模型。
class Download{
private SimpleObjectProperty<Integer> part1;
private SimpleObjectProperty<Integer> part2;
public SimpleObjectProperty<Integer> getPart1Property(){
return part1;
}
public SimpleObjectProperty<Integer> getPart2Property(){
return part2;
}
}
现在我用这样的表视图设置了 javafx GUI。
TableView<Download> table=new TableView<Download>();
table.setItems(.. Observable list of Download objects ...);
如果我想在表视图中为 part1 的值添加一列,我可以这样做。
TableColumn<Download,Integer> part1 = new TableColumn<Download,Integer>("Part 1 value");
part1.setCellValueFactory(
(TableColumn.CellDataFeatures<Download, Integer> download) -> download.getValue().getPart1Property());
现在我需要表格视图中的一列来显示part1 和 part2 的值的总和。如何在 javafx 中实现这一点?
我已经阅读了这里的文档,但遗憾的是找不到任何方法可以实现这一点。任何帮助,将不胜感激。
解决方案
您需要返回 cellValueFactory 中所需值的总和。
TableColumn<Download, Integer> totalCol = new TableColumn<>("Total");
totalCol.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue().getPart1() + param.getValue().getPart2()));
完整的工作演示如下:
import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class CustomCellValueFactoryDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<Download> downloads = FXCollections.observableArrayList();
downloads.add(new Download(23,56));
downloads.add(new Download(56,43));
downloads.add(new Download(97,3));
downloads.add(new Download(67,23));
TableView<Download> tableView = new TableView<>();
TableColumn<Download, Integer> part1Col = new TableColumn<>("Part 1");
part1Col.setCellValueFactory(param -> param.getValue().part1Property());
TableColumn<Download, Integer> part2Col = new TableColumn<>("Part 2");
part2Col.setCellValueFactory(param -> param.getValue().part2Property());
TableColumn<Download, Integer> totalCol = new TableColumn<>("Total");
totalCol.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue().getPart1() + param.getValue().getPart2()));
tableView.getColumns().addAll(part1Col,part2Col, totalCol);
tableView.setItems(downloads);
Scene sc = new Scene(tableView);
primaryStage.setScene(sc);
primaryStage.show();
}
class Download{
SimpleObjectProperty<Integer> part1 = new SimpleObjectProperty<>(0);
SimpleObjectProperty<Integer> part2= new SimpleObjectProperty<>(0);
public Download(int p1, int p2){
part1.set(p1);
part2.set(p2);
}
public int getPart1() {
return part1.get();
}
public SimpleObjectProperty<Integer> part1Property() {
return part1;
}
public void setPart1(int part1) {
this.part1.set(part1);
}
public int getPart2() {
return part2.get();
}
public SimpleObjectProperty<Integer> part2Property() {
return part2;
}
public void setPart2(int part2) {
this.part2.set(part2);
}
}
}
推荐阅读
- ruby - 如何构建一个 ruby .deb 包?
- firebase - 如何避免在 firebase ML Kit 的人脸检测 API 中捕获模糊图像
- c - 为什么 fgets() 在第一个元素之后不读取?
- url - TYPO3 v9 slug 后备中文、俄语或阿拉伯语 URL 到拉丁语
- python - 在 html5 文件中使用 jinja 格式的 for 循环出错
- javascript - Javascript中的简单求和不起作用
- reactjs - 如果页面未知或重定向,托管的静态文件不会重定向
- html - 选择元素(optgroup)值未在 Safari 中显示 - CSS
- angular - 在页面之间共享数据 - 错误 - 错误:类型 HomePage 是 2 个模块声明的一部分:
- python - 使用 django 上传和查看图像的问题