JavaFx TableView set cell value when editing another cell

那年仲夏 提交于 2020-02-08 02:45:23

问题


My experience with TableView is only 3 days(Searching and learning).JavaFx tableView seems very complicated to me.

I have a simple application with tableview of few columns(Name,Quantity,MRP,Total). The table is editable. If a Quantity cell is edited then it would do multiplication of quantitycolumn*mrpcolumn and set the value for totalcolumn.

This is what I want:

Here is the data processing Class called TableData:

public class TableData {
    private final SimpleStringProperty name;
    private final SimpleStringProperty batch;
    private final SimpleStringProperty exp;
    private final SimpleIntegerProperty qty;
    private final SimpleDoubleProperty mrp;
    private final SimpleDoubleProperty amt;


    public TableData(String name,String batch,
                     String exp,int qty,Double mrp,Double amt) {
        this.name = new SimpleStringProperty(name);
        this.batch = new SimpleStringProperty(batch);
        this.exp = new SimpleStringProperty(exp);
        this.qty = new SimpleIntegerProperty(qty);
        this.mrp = new SimpleDoubleProperty(mrp);
        this.amt = new SimpleDoubleProperty(amt);

    }

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

    public SimpleStringProperty nameProperty() {
        return name;
    }

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

    public String getBatch() {
        return batch.get();
    }

    public SimpleStringProperty batchProperty() {
        return batch;
    }

    public void setBatch(String batch) {
        this.batch.set(batch);
    }

    public String getExp() {
        return exp.get();
    }

    public SimpleStringProperty expProperty() {
        return exp;
    }

    public void setExp(String exp) {
        this.exp.set(exp);
    }

    public int getQty() {
        return qty.get();
    }

    public SimpleIntegerProperty qtyProperty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty.set(qty);
    }

    public double getMrp() {
        return mrp.get();
    }

    public SimpleDoubleProperty mrpProperty() {
        return mrp;
    }

    public void setMrp(double mrp) {
        this.mrp.set(mrp);
    }

    public double getAmt() {
        return amt.get();
    }

    public SimpleDoubleProperty amtProperty() {
        return amt;
    }

    public void setAmt(double amt) {
        this.amt.set(amt);
    }
}

I tried to add listener as follows in initialize():

tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TableData>() {
    @Override
    public void changed(ObservableValue<? extends TableData> observable, TableData oldValue, TableData newValue) {
        System.out.println("The value:"+newValue.getQty());
        getQtyAmt(newValue);
        //getQtyAmt(newValue);

    }
});

getQtyAmt method:

public void getQtyAmt(TableData tableData){
    Double am = tableData.getMrp() * tableData.getQty();
    tableData.setAmt(am);
}

Here is how I am making the TableView editable:

public void editTable(){

    nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    qtyColumn.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
    expColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    mrpColumn.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
    amtColumn.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
    final int[] ad = {0};

    nameColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<TableData, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<TableData, String> event) {
            ((TableData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setName(event.getNewValue());
            //TablePosition tp = tableView.getFocusModel().getFocusedCell();

        }
    });
    qtyColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<TableData, Integer>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<TableData, Integer> event) {
            ((TableData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setQty(event.getNewValue());

            ad[0] = event.getTableView().getItems().get(event.getTablePosition().getRow()).getQty();
            dynCal();


        }
    });
    expColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<TableData, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<TableData, String> event) {
            ((TableData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setExp(event.getNewValue());
        }
    });
    mrpColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<TableData, Double>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<TableData, Double> event) {
            event.getTableView().getItems().get(event.getTablePosition().getRow()).setMrp(event.getNewValue());

        }
    });



}

How I can do real time calculation of two cells(quantitycolumn*mrpcolumn) and then set the result to amtcolumn cell?


回答1:


Since Amt is calculated from other properties, you should probably make it read only, or at the very least not allow to set it through the constructor.

The simplest way is to simply have it be the actual calculation you want -

DoubleBinding amt = qty.multiply(mrp);

Since DoubleBinding implements ObservableValue<Number> you should have no problem using it as a non-editable value in the table.

See also Bindings



来源:https://stackoverflow.com/questions/38157860/javafx-tableview-set-cell-value-when-editing-another-cell

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!