javafx表格单元格onEditCommit事件未被触发?

时间:2013-10-22 10:13:17

标签: java javafx-2 fxml

我有一个TableView,它有很少的可编辑列。在JavaFX Scene Builder中,可编辑表列的在编辑提交上,我映射了一个FXML控制器方法,该方法调用DAO服务从数据库返回数据。 问题是在编辑表格单元格后没有调用事件处理程序方法。我希望在编辑单元格数据后按Tab键时触发此事件。 这该怎么做?请建议

3 个答案:

答案 0 :(得分:2)

我对CheckBoxTableCell和DatePickerTableCell以及ColorPickerTableCells有同样的问题: - (

我这样处理:在控件的事件中,我通过" ((输入)getTableView()。getItems()。get(getTableRow())返回正在使用的POJO对象。 getIndex()"我更新类似于在OnEditCommit方法中完成...

所以对我而言,它看起来像这样(更新颜色):

 ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());

以下是ColorPickerCell的示例 :

public class ColorPickerTableCell<Inputs> extends TableCell<Inputs, Color>{
private ColorPicker cp;

public ColorPickerTableCell(){        
    cp = new ColorPicker(); 
    cp.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            commitEdit(cp.getValue());
            updateItem(cp.getValue(), isEmpty());
            ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());
        }            
    });                
    setGraphic(cp);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    setEditable(true);        
}     
@Override
protected void updateItem(Color item, boolean empty) {
    super.updateItem(item, empty);
    cp.setVisible(!empty);
    this.setItem(item);
    cp.setValue(item);
}
}

使用这个简单的JavaFX的POJO:

    public ObjectProperty<Color> color = new SimpleObjectProperty<Color>();

    this.color = new SimpleObjectProperty(color);

    public ObjectProperty<Color> colorProperty() {
    return color;
 }

public void setColor(Color color2) {
    color.set(color2);
}

我不知道这是否是一个很好的方式来实现,但它对我有用...请注意,JavaFX的POJO只能在&#34; ActionEvent&#34;请求(组合框,日期选择器,颜色选择器等)。

此致

答案 1 :(得分:0)

以下是我用来从tableview的可编辑单元格调用DAO的方法。

private TableColumn<Person, String> createNameCol(){
    TableColumn col = new TableColumn("Name");
    col.setCellValueFactory(
            new PropertyValueFactory<Person, String>("name"));
    col.setCellFactory(TextFieldTableCell.forTableColumn());
    col.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Person, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Person, String> t) {

            Person p = t.getRowValue();
            p.setName(t.getNewValue());
            sl.update(p); //  This is where I call the update method from my DAO.
        }
    });

    return col;
}

如果这不起作用,请发布您的代码。

修改

这是一个很好的tutorial for the editable tableViews

答案 2 :(得分:0)

在这一天浪费了大部分时间,在互联网上搜寻了一些例子,这些例子说的差不多,并且都在做我已经在做的事情,这就是我发现的事情:

在编辑作为TextFieldTableCell的单元格中的值时,必须按Enter键才能进行编辑提交。如果您从单元格中跳出,则该单元格仍处于编辑模式(您可以继续按Tab键以返回到该单元格的文本字段,并且如果您简单地单击该单元格,则将调用TextFieldTableCell的cancelEdit方法从而取消编辑:-(