首页 > 解决方案 > 如何将 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 中实现这一点?

我已经阅读了这里的文档,但遗憾的是找不到任何方法可以实现这一点。任何帮助,将不胜感激。

标签: javajavafxmodel-view-controllertableview

解决方案


您需要返回 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);
        }
    }
}

推荐阅读