我似乎无法找到这个和java / javafx的新解决方案:
我有一个3列tableview,最后一列是价格列 . 我想在tableview中添加或删除行时显示price列的运行总计 .
TableView是从ObservableList填充的,它每行包含3个字段对象 . String id,String product,Double price .........这是我希望在单独的textField中保持运行总计的价格
由于tableview的项目是ObservableList,您可以跟踪ListChangeListener,并更新计算的总价格:
public class Sample extends Application { @Override public void start( Stage primaryStage ) { // items set to tableview ObservableList<Product> products = FXCollections.observableArrayList(); DoubleProperty totalProperty = new SimpleDoubleProperty( 0 ); products.addListener(( ListChangeListener.Change<? extends Product> change ) -> { while ( change.next() ) { if ( change.wasAdded() ) { for ( Product p : change.getAddedSubList() ) { totalProperty.set( totalProperty.get() + p.getPrice() ); } } else if ( change.wasRemoved() ) { for ( Product p : change.getRemoved() ) { totalProperty.set( totalProperty.get() - p.getPrice() ); } } } }); TextField textField = new TextField(); textField.textProperty().bind( totalProperty.asString() ); Random random = new Random(); Button btnAdd = new Button( "Add product" ); btnAdd.setOnAction( ( ActionEvent event ) -> { products.add( new Product( "new", ( double ) random.nextInt( 100 ) ) ); } ); Button btnRemove = new Button( "Remove product" ); btnRemove.setOnAction( ( ActionEvent event ) -> { if ( products.size() > 0 ) { products.remove( random.nextInt( products.size() ) ); } } ); VBox root = new VBox(); root.getChildren().addAll( textField, btnAdd, btnRemove ); Scene scene = new Scene( root, 300, 250 ); primaryStage.setScene( scene ); primaryStage.show(); } public static class Product { String name; Double price; public Product( String name, Double price ) { this.name = name; this.price = price; } public String getName() { return name; } public void setName( String name ) { this.name = name; } public Double getPrice() { return price; } public void setPrice( Double price ) { this.price = price; } } public static void main( String[] args ) { launch( args ); } }
1 回答
由于tableview的项目是ObservableList,您可以跟踪ListChangeListener,并更新计算的总价格: