编辑另一个单元格时,JavaFx TableView设置单元格值 [英] JavaFx TableView set cell value when editing another cell

查看:204
本文介绍了编辑另一个单元格时,JavaFx TableView设置单元格值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用TableView的经验只有3天(搜索和学习).JavaFx tableView对我来说似乎很复杂。

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

我有一个简单的应用程序,其中tableview为几列(名称数量 MRP 总计)。该表是可编辑的。如果编辑了 Quantity 单元格,那么它将乘以 quantitycolumn * mrpcolumn ,并设置totalcolumn的值。

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:

这是名为TableData的数据处理类:

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

我试图在initialize()中添加如下监听器:

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方法:

getQtyAmt method:

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

以下是我如何制作 TableView 可编辑:

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

        }
    });



}

我该怎么做实时计算两个单元格( quantitycolumn * mrpcolumn ),然后将结果设置为amtcolumn单元格?

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

推荐答案

由于 Amt 是从其他属性计算的,你应该把它设为只读,或者至少不允许通过构造函数设置它。

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

由于 DoubleBinding 实现 ObservableValue< Number> 您可以毫无问题地将其用作表格中的不可编辑值。

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

参见绑定

这篇关于编辑另一个单元格时,JavaFx TableView设置单元格值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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