JavaFX Tableview - 依赖于其他列的列值 [英] JavaFX Tableview - column value dependent on other columns

查看:121
本文介绍了JavaFX Tableview - 依赖于其他列的列值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在JavaFX中有一个 TableView 。它有一个字段 subTotal ,它取决于字段的值数量价格。我为 subTotal 添加了一个新列。

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.

我有文本字段可以向表中添加新行。但是,添加按钮想要为 subTotal 设置另一个 textfield ,尽管对于小计列并不是必需的。

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.

到目前为止我尝试过:

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

数据类

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

}


推荐答案

您可以从JavaFX的权力中获益 bind 值。

You can take benefit from JavaFX's power to bind value.

执行时几点没有意义如上所述的场景:

Few points to take care of while implementing a scenario as stated above:


  • POJO类(在您的情况下数据)字段必须具有正确的类型。例如,价格和数量必须是 SimpleIntegerProperty 而不是 SimpleStringProperty 。这将有助于我们使用 Bindings

  • SubTotal 字段取决于价格和数量的价值。实现此目的的最佳方法是绑定 subTotalProperty到价格和数量的乘法绑定

  • The POJO class(in your case Data) fields must have correct types. For example price and quantity must be of SimpleIntegerProperty instead of SimpleStringProperty. This will help us in using Bindings.
  • SubTotal field depends on the values of price and quantity. The best way to achieve this is to bind subTotalProperty to a multiply Binding of price and quantity.

我创建了一个(不那么)简单示例基本可编辑的tableview 来显示方法。它有其他功能,如可编辑单元格,您(或其他寻求相同问题的人)可能需要;)

I have created a (not so) simple example basic editable tableview to show the approach. It has additional features, like editable cells, that you (or others seeking the same problem) might need ;)

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.NumberBinding;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.converter.NumberStringConverter;

public class TableViewSample extends Application {

    private TableView<Product> table = new TableView<Product>();
    private final ObservableList<Product> data =
            FXCollections.observableArrayList(
                    new Product("Notebook", 10, 12),
                    new Product("Eraser", 20, 12),
                    new Product("Pencil", 30, 12),
                    new Product("Pen", 40, 12),
                    new Product("Glue", 50, 12));
    final HBox hb = new HBox();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Book Store Sample");
        stage.setWidth(650);
        stage.setHeight(550);

        final Label label = new Label("Book Store");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);


        TableColumn name = new TableColumn("Name");
        name.setMinWidth(100);
        name.setCellValueFactory(
                new PropertyValueFactory<Product, String>("name"));
        name.setCellFactory(TextFieldTableCell.forTableColumn());
        name.setOnEditCommit(
                new EventHandler<CellEditEvent<Product, String>>() {
                    @Override
                    public void handle(CellEditEvent<Product, String> t) {
                        ((Product) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setName(t.getNewValue());
                    }
                }
        );


        TableColumn priceCol = new TableColumn("Price");
        priceCol.setMinWidth(100);
        priceCol.setCellValueFactory(
                new PropertyValueFactory<Product, String>("price"));
        priceCol.setCellFactory(TextFieldTableCell.<Product, Number>forTableColumn(new NumberStringConverter()));
        priceCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Product, Number>>() {
                    @Override
                    public void handle(CellEditEvent<Product, Number> t) {
                        ((Product) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setPrice(t.getNewValue().intValue());
                    }
                }
        );

        TableColumn quantityCol = new TableColumn("Quantity");
        quantityCol.setMinWidth(200);
        quantityCol.setCellValueFactory(
                new PropertyValueFactory<Product, Number>("quantity"));
        quantityCol.setCellFactory(TextFieldTableCell.<Product, Number>forTableColumn(new NumberStringConverter()));
        quantityCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Product, Number>>() {
                    @Override
                    public void handle(CellEditEvent<Product, Number> t) {
                        ((Product) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setQuantity(t.getNewValue().intValue());
                    }
                }
        );

        TableColumn subTotalCol = new TableColumn("Sub Total");
        subTotalCol.setMinWidth(200);
        subTotalCol.setCellValueFactory(
                new PropertyValueFactory<Product, String>("subTotal"));


        table.setItems(data);
        table.getColumns().addAll(name, priceCol, quantityCol, subTotalCol);

        final TextField addName = new TextField();
        addName.setPromptText("Name");
        addName.setMaxWidth(name.getPrefWidth());
        final TextField addPrice = new TextField();
        addPrice.setMaxWidth(priceCol.getPrefWidth());
        addPrice.setPromptText("Price");
        final TextField addQuantity = new TextField();
        addQuantity.setMaxWidth(quantityCol.getPrefWidth());
        addQuantity.setPromptText("Quantity");

        final Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.add(new Product(
                        name.getText(),
                        Integer.parseInt(addPrice.getText()),
                        Integer.parseInt(addQuantity.getText())));
                addName.clear();
                addPrice.clear();
                addQuantity.clear();
            }
        });

        hb.getChildren().addAll(addName, addPrice, addQuantity, addButton);
        hb.setSpacing(3);

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table, hb);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        stage.setScene(scene);
        stage.show();
    }

    public static class Product {

        private final SimpleStringProperty name;
        private final SimpleIntegerProperty price;
        private final SimpleIntegerProperty quantity;
        private final SimpleIntegerProperty subTotal;

        private Product(String name, int price, int quantity) {
            this.name = new SimpleStringProperty(name);
            this.price = new SimpleIntegerProperty(price);
            this.quantity = new SimpleIntegerProperty(quantity);
            this.subTotal = new SimpleIntegerProperty();
            NumberBinding multiplication = Bindings.multiply(this.priceProperty(), this.quantityProperty());
            this.subTotalProperty().bind(multiplication);
        }

        public String getName() {
            return name.get();
        }

        public SimpleStringProperty nameProperty() {
            return name;
        }

        public void setName(String name) {
            this.name.set(name);
        }

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

        public SimpleIntegerProperty priceProperty() {
            return price;
        }

        public void setPrice(int price) {
            this.price.set(price);
        }

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

        public SimpleIntegerProperty quantityProperty() {
            return quantity;
        }

        public void setQuantity(int quantity) {
            this.quantity.set(quantity);
        }

        public int getSubTotal() {
            return subTotal.get();
        }

        public SimpleIntegerProperty subTotalProperty() {
            return subTotal;
        }

        public void setSubTotal(int subTotal) {
            this.subTotal.set(subTotal);
        }
    }
}

截图

注意 - 我已定义 setCellFactory setOnCommit 到每个列。这是因为名称,价格和数量列可编辑。如果您不寻求可编辑的属性,欢迎您将其删除。

Note - I have defined setCellFactory and setOnCommit to each of the columns. This is because the name, price and quantity columns are editable. You are most welcome to remove them in case you do not seek editable property.

这篇关于JavaFX Tableview - 依赖于其他列的列值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆