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