首页 文章

JavaFX TableView:在特定列中添加单个值

提问于
浏览
0

我似乎无法找到这个和java / javafx的新解决方案:

我有一个3列tableview,最后一列是价格列 . 我想在tableview中添加或删除行时显示price列的运行总计 .

TableView是从ObservableList填充的,它每行包含3个字段对象 . String id,String product,Double price .........这是我希望在单独的textField中保持运行总计的价格

1 回答

  • 1

    由于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 );
        }
    
    }
    

相关问题