0

I cant seem to find a solution for this and new to java/ javafx:

I have a 3 column tableview , last column is a price column. I would like to display a running total of the price column whenever a row is added or deleted from the tableview.

TableView is populated from an ObservableList which holds a 3 field object per row. String id,String product, Double price.........it is the price I would like to keep a running total of in a separate textField

1 Answer 1

1

Since the items of tableview are ObservableList, you may track for ListChangeListener, and update the calculated total price:

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

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.