如何获得具有可编辑列的TableView的列总计?

时间:2019-09-09 19:11:51

标签: javafx tornadofx

我有一个表格视图,显示了从星期一到星期五,不同项目的员工工作时间时间表。数据源是时间表类的列表,这些类具有到一周中每一天的float属性。例如,我想显示一个值,该值将“星期一”列中的所有小时数相加,并显示“星期一小时数”总计。我认为进行一些研究会很容易,因为对我来说,想要一列总数在使用TableViews的数据驱动应用程序中很常见,但我似乎找不到一个完美的答案,或者根本找不到任何答案。如果我只要在时间表列表更改时就可以计算列总数,会更容易,但是当列值更改/由用户编辑时,我还必须听取。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是非toronadofx版本。在list-item_data中,更新可观察列表并对该列求和。

  

主要

setOnEditCommit
  

时间

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class App extends Application
{

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        Label total = new Label("0");

        ObservableList<Time> data = FXCollections.observableArrayList();
        data.add(new Time(0));
        data.add(new Time(3));

        TableView<Time> tableView = new TableView();
        tableView.setEditable(true);
        tableView.setItems(data);

        total.setText(Integer.toString(data.stream().mapToInt(Time::getHours).sum()));
        TableColumn<Time, Integer> column1 = new TableColumn("Time");
        column1.setCellValueFactory(new PropertyValueFactory<>("hours"));
        column1.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Integer>()
        {
            @Override
            public String toString(Integer t)
            {
                return Integer.toString(t);
            }

            @Override
            public Integer fromString(String string)
            {
                return Integer.parseInt(string);
            }
        }));
        column1.setOnEditCommit((CellEditEvent<Time, Integer> t) -> {
            ((Time) t.getTableView().getItems().get(
                    t.getTablePosition().getRow())).setHours(t.getNewValue());

            total.setText(Integer.toString(data.stream().mapToInt(Time::getHours).sum()));
        });;

        tableView.getColumns().add(column1);

        VBox vbox = new VBox(tableView, total);

        Scene scene = new Scene(vbox);

        primaryStage.setScene(scene);

        primaryStage.show();
    }

}