编辑另一个单元格

时间:2018-02-15 05:03:30

标签: java javafx javafx-8

我已阅读this,但我无法清楚地看到答案。

我尝试做的是在将值插入另一个单元格时,从TableColumn获取单元格内的值...

Calculate difference

一小段代码。

colExistenciaF.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
    colExistenciaF.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Productos, Double>>() {
        @Override
        public void handle(CellEditEvent<Productos, Double> event) {
            event.getTableView().getItems().get(event.getTablePosition().getRow())
                    .setExistencia(event.getNewValue());

            // Code to place the calculated value in that other column
        }
    });

观察,我的&#34; Existencia Actual&#34;列以这种方式声明:

@FXML
private TableColumn<Productos, Double> colExistenciaI;

&#34; Existencia Actual&#34;和&#34; Diferencia&#34;列这一个:

@FXML
private TableColumn<Productos, Double> colExistenciaF;
@FXML
private TableColumn<Movproductos, Double> colDiferencia;

这是因为我拥有存储初始库存(Producto.class)或产品存在的实体,但是当我需要进行交易或移动时,我使用另一个实体(MovProducto.class)。我不知道这是否相关,但不得不提及以防你需要更多的背景。

修改

为了给你更多的上下文,我正在使用hibernate,所以我的pojos类不能使用(如我所知)StringProperty或数据库中不存在的任何类型的数据类型。

这些是我在这个问题上使用的pojos:

这些是我的控制器(更糟糕的是DAO类的坏名称)

最后是databaseFXML file

提前感谢James_D博士。 :)

2 个答案:

答案 0 :(得分:0)

我创建了一个可以检查的简单示例。

public class Controller implements Initializable {

    @FXML
    private TableView<Model> table;

    @FXML
    private TableColumn<Model, Double> initial;
    @FXML
    private TableColumn<Model, Double> actual;
    @FXML
    private TableColumn<Model, Double> diff;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        initial.setCellValueFactory(data -> data.getValue().initialProperty().asObject());
        actual.setCellValueFactory(data -> data.getValue().actualProperty().asObject());
        diff.setCellValueFactory(data -> data.getValue().differenceProperty().asObject());

        initial.setCellFactory(factory -> new TextFieldTableCell<>(new DoubleConverter()));
        actual.setCellFactory(factory -> new TextFieldTableCell<>(new DoubleConverter()));

        table.setEditable(true);
        diff.setEditable(false); // I think it makes sense to set non-editable

        ObservableList<Model> data = FXCollections.observableArrayList();

        data.add(new Model(10D, 9D));
        data.add(new Model(98D, 45D));

        table.setItems(data);
    }

    class Model {

        private DoubleProperty initial;
        private DoubleProperty actual;
        private DoubleProperty difference;

        public Model(Double initial, Double actual) {
            this.initial = new SimpleDoubleProperty(initial);
            this.actual = new SimpleDoubleProperty(actual);
            this.difference = new SimpleDoubleProperty(initial - actual);
            // Here is where the "magic" happens :)
            this.difference.bind(this.initial.subtract(this.actual));
        }

        public double getInitial() {
            return initial.get();
        }

        public DoubleProperty initialProperty() {
            return initial;
        }

        public double getActual() {
            return actual.get();
        }

        public DoubleProperty actualProperty() {
            return actual;
        }

        public double getDifference() {
            return difference.get();
        }

        public DoubleProperty differenceProperty() {
            return difference;
        }
    }

    class DoubleConverter extends StringConverter<Double> {

        @Override
        public String toString(Double object) {
            return object.toString();
        }

        @Override
        public Double fromString(String string) {
            return Double.valueOf(string);
        }
    }

}

当然,您可以处理NumberformatException之类的一些事情。但是你想要解决我觉得它有效。

答案 1 :(得分:0)

解决

步骤:

  1. 使用属性访问代替字段访问。有关详细信息,请参阅此post,您也可以使用this gists作为示例。
  2. 完成第1步后,您可以在需要计算的列中使用此代码(根据需要调整代码)。我从这个question得到了这个想法。

        colDiferencia.setCellValueFactory((cellData) -> {
        cellData.getValue().DiferenciaExistenciaProperty()
                .bind(cellData.getValue().ProductosExistenciaActual().subtract(
                        Double.valueOf(String.valueOf(cellData.getValue().ProductosExistenciaInicialProperty()))));
        return cellData.getValue().DiferenciaExistenciaProperty().asObject();
    });
    
    colExistenciaF.setCellFactory((d) -> {
        TableCell<Productos, Double> cell = new TableCell<Productos, Double>() {
            @Override
            protected void updateItem(Double item, boolean empty) {
                super.updateItem(item, empty);
                setText(String.valueOf(item));
            }
    
        };
        return cell;
    });
    
  3. 使用这种方法你可以解决问题,但我很确定就像我一样,你会得到一些其他的错误或问题。

    到目前为止,我可以在感谢所有人参与之前关闭这个问题。

    非常感谢&lt; 3 @James_D和@Sunflame我希望你能看到我的练习项目并帮助我提高他们的帮助!再次感谢。

相关问题