Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX Tableview - column value dependent on other columns

Tags:

javafx

I have a TableView in JavaFX. It has a field subTotal which depends on the value of the fields quantity and price. I added a new column for the subTotal.

I have textfields present to add a new row to the table. But, the add button wants to have another textfield for the subTotal, although it does not really necessary for the subtotal column.

What I have tried so far :

TableColumn columnCodeProduct = new TableColumn("Product Code");
columnCodeProduct.setMinWidth(100);
columnCodeProduct.setCellValueFactory(new PropertyValueFactory<Data , Integer>("productname "));

TableColumn columnProductName = new TableColumn("Product Name");
columnProductName.setMinWidth(140);
columnProductName.setCellValueFactory(new PropertyValueFactory<Data , String>("codeproduct"));

TableColumn columnPrice = new TableColumn("Price");
columnPrice.setMinWidth(100);
columnPrice.setCellValueFactory(new PropertyValueFactory<Data , Integer>("price"));

TableColumn columQuantity = new TableColumn("Quantity");
columQuantity.setMinWidth(100);
columQuantity.setCellValueFactory(new PropertyValueFactory<Data , Integer>("quantity"));


TableColumn columnTotal = new TableColumn("Sub Total");
columnTotal.setMinWidth(100);
columQuantity.setCellValueFactory(new PropertyValueFactory<Data , Integer>("sub"));

tableData.getColumns().addAll(columnCodeProduct , columnProductName , columnPrice ,  columQuantity );

tableData.setItems(data);


addButton = new Button("Add Item");


addButton.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event)
    {
        if(addproCodeTextfield.getText().isEmpty() || addproNameTextfield.getText().isEmpty()
            || addPriceTextfield.getText().isEmpty() || quantityTextField.getText().isEmpty())
        {
            System.out.println("Please Add information to all the fields");
        } else {
            data.add(new Data (

                           addproCodeTextfield.getText(),
                           addproNameTextfield.getText(),
                 addPriceTextfield.getText(),                             
                           quantityTextField.getText()));                             
             methodTotal();
        }
    }
});

Data Class

public class Data
{
    private final SimpleStringProperty codeproduct;
    private final SimpleStringProperty productname;
    private final SimpleStringProperty price ;
    private final SimpleStringProperty quantity;



    public Data (String code , String proname ,  String presyo ,  String quant )
    {
        this.codeproduct = new SimpleStringProperty(code);
        this.productname = new SimpleStringProperty(proname);
        this.price = new SimpleStringProperty(presyo);
        this.quantity = new SimpleStringProperty(quant);

    }

    public String getcodeProduct()
    {
        return codeproduct.get();
    }

    public String getproductName()
    {
        return productname.get();
    }

    public String getPrice()
    {
        return price.get();
    }

    public String getQuantity()
    {
        return quantity.get();
    }

}
like image 667
unknown Avatar asked Apr 12 '15 12:04

unknown


1 Answers

I would restructure your model class as @ItachiUchiha suggests. If you feel you need to keep the data stored with String representations, you can just create a binding for the subtotal column:

TableColumn<Data, Number> subtotalColumn = new TableColumn<>("Sub Total");
subTotalColumn.setCellValueFactory(cellData -> {
    Data data = cellData.getValue();
    return Bindings.createDoubleBinding(
            () -> {
                try {
                    double price = Double.parseDouble(data.getPrice());
                    int quantity = Integer.parseInt(data.getQuantity());
                    return price * quantity ;
                } catch (NumberFormatException nfe) {
                    return 0 ;
                }
            },
            data.priceProperty(),
            data.quantityProperty()
    );
});
like image 50
James_D Avatar answered Sep 20 '22 19:09

James_D