Javafx:单击按钮时提交表列

Javafx:单击按钮时提交表列,javafx,tableview,Javafx,Tableview,我有一种方法,可以使一个TableColumn可编辑,我根据这个方法进行了编辑,其中推荐的两个更改是使用setOnAction更改focusedProperty并添加绑定。方法如下: public static <T> void setAutoCompleteTableColumn(TableColumn<T,String> column, BiConsumer<T, String> field, String type, BiConsumer handleU

我有一种方法,可以使一个
TableColumn
可编辑,我根据这个方法进行了编辑,其中推荐的两个更改是使用
setOnAction
更改
focusedProperty
并添加绑定。方法如下:

public static <T> void setAutoCompleteTableColumn(TableColumn<T,String> column, BiConsumer<T, String> field, String type, BiConsumer handleUpdates, List autoComplete){
    column.setCellFactory(param -> {
        return new TableCell<T, String>(){
            private TextField textField;

            @Override
            public void startEdit() {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.selectAll();
            }

            @Override
            public void cancelEdit() {
                super.cancelEdit();
                setText((String) getItem());
                setGraphic(null);
            }


            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {

                    if (isEditing()) {
                        if (textField != null) {
                            textField.setText(getString());
                        }
                        setText(null);
                        setGraphic(textField);
                    } else {
                        setText(getString());
                        setGraphic(null);
                    }
                }
            }

            private void createTextField(){
                textField = new TextField(getString());
                textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
                textField.setOnAction(event ->{
                    if(textField.getText() != ""){
                        commitEdit(textField.getText());
                    }
                });

                AutoCompletionBinding<T> binding = TextFields.bindAutoCompletion(textField,autoComplete);
            }

            private String getString() {
                return getItem() == null ? "" : getItem().toString();
            }
        };
    });
    column.setOnEditCommit(event -> {
        T model = event.getRowValue();
        if (!event.getNewValue().isEmpty()) {
            Cloner cloner = new Cloner();
            final T oldModel = cloner.deepClone(model);
            
            //Update the old value with the new value
            field.accept(model, event.getNewValue());

            //Retrieve changes
            handleUpdates.accept(oldModel, model);
        }
    });

}
TableColumn<Purchase, String> nameColumn = new TableColumn<>();
setAutoCompleteTableColumn(nameColumn, (p,s) -> validatePurchaseEdit(p,s), "text", (o, n) -> updateTracker(o, n), appState.items);
public static void setAutoCompleteTableColumn(表列、双消费者字段、字符串类型、双消费者手册更新、列表自动完成){
column.setCellFactory(参数->{
返回新的TableCell(){
私有文本字段文本字段;
@凌驾
公开作废已启动IT(){
super.startEdit();
createTextField();
setText(空);
设置图形(文本字段);
textField.selectAll();
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
setText((字符串)getItem());
设置图形(空);
}
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
if(textField!=null){
setText(getString());
}
setText(空);
设置图形(文本字段);
}否则{
setText(getString());
设置图形(空);
}
}
}
私有void createTextField(){
textField=newtextfield(getString());
textField.setMinWidth(this.getWidth()-this.getGraphicTextGap()*2);
textField.setOnAction(事件->{
if(textField.getText()!=“”){
committedit(textField.getText());
}
});
AutoCompletionBinding=TextFields.bindsautocompletion(textField,autoComplete);
}
私有字符串getString(){
返回getItem()==null?”:getItem().toString();
}
};
});
column.setOnEditCommit(事件->{
T model=event.getRowValue();
如果(!event.getNewValue().isEmpty()){
克隆人克隆人=新克隆人();
最终T oldModel=cloner.deepClone(model);
//用新值更新旧值
accept(model,event.getNewValue());
//检索更改
handleUpdates.accept(旧型号、型号);
}
});
}
我在控制器中使用此方法,如下所示:

public static <T> void setAutoCompleteTableColumn(TableColumn<T,String> column, BiConsumer<T, String> field, String type, BiConsumer handleUpdates, List autoComplete){
    column.setCellFactory(param -> {
        return new TableCell<T, String>(){
            private TextField textField;

            @Override
            public void startEdit() {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.selectAll();
            }

            @Override
            public void cancelEdit() {
                super.cancelEdit();
                setText((String) getItem());
                setGraphic(null);
            }


            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {

                    if (isEditing()) {
                        if (textField != null) {
                            textField.setText(getString());
                        }
                        setText(null);
                        setGraphic(textField);
                    } else {
                        setText(getString());
                        setGraphic(null);
                    }
                }
            }

            private void createTextField(){
                textField = new TextField(getString());
                textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
                textField.setOnAction(event ->{
                    if(textField.getText() != ""){
                        commitEdit(textField.getText());
                    }
                });

                AutoCompletionBinding<T> binding = TextFields.bindAutoCompletion(textField,autoComplete);
            }

            private String getString() {
                return getItem() == null ? "" : getItem().toString();
            }
        };
    });
    column.setOnEditCommit(event -> {
        T model = event.getRowValue();
        if (!event.getNewValue().isEmpty()) {
            Cloner cloner = new Cloner();
            final T oldModel = cloner.deepClone(model);
            
            //Update the old value with the new value
            field.accept(model, event.getNewValue());

            //Retrieve changes
            handleUpdates.accept(oldModel, model);
        }
    });

}
TableColumn<Purchase, String> nameColumn = new TableColumn<>();
setAutoCompleteTableColumn(nameColumn, (p,s) -> validatePurchaseEdit(p,s), "text", (o, n) -> updateTracker(o, n), appState.items);
TableColumn name column=newtableColumn();
setAutoCompleteTableColumn(nameColumn,(p,s)->validatePurchaseEdit(p,s),“text”,(o,n)->updateTracker(o,n),appState.items);
我有一个按钮点击事件,它将
TableView
editable切换为false。
由于某些原因,当执行此事件时,我正在编辑的当前单元格确实提交编辑,但另一个单元格(随机单元格)切换到编辑模式。有人能解释一下发生了什么,我怎样才能让所有单元格都提交编辑吗?

textField.getText()!=“
这是个坏主意。除非您知道字符串都是内部的,否则不能保证文本值是内部的,字符串应该使用
equals
进行比较。(在本例中,
!textField.getText().isEmpty()
应该可以做到这一点…)好的,我刚刚更改了它,但问题仍然存在。如果您发布文章来重现您的问题,那就太好了。我在这个链接中发现了一个更好的实现