Javafx 如何将CellFactorys用于TreeItem<;MyNode>;而不是TreeItem<;字符串>;

Javafx 如何将CellFactorys用于TreeItem<;MyNode>;而不是TreeItem<;字符串>;,javafx,treeview,Javafx,Treeview,我正在使用下面的代码,当有人双击树视图时,可以在树视图中编辑一些树项。最近,我更改了我的TreeView,使其填充了TreeItem,而不是TreeItem。可编辑单元格的代码现在不起作用,我不知道应该对其进行哪些更改: TextFieldTreeCellImpl.java: public final class TextFieldTreeCellImpl extends TreeCell<String> { private TextField textField;

我正在使用下面的代码,当有人双击树视图时,可以在树视图中编辑一些树项。最近,我更改了我的TreeView,使其填充了
TreeItem
,而不是
TreeItem
。可编辑单元格的代码现在不起作用,我不知道应该对其进行哪些更改:

TextFieldTreeCellImpl.java:

public final class TextFieldTreeCellImpl extends TreeCell<String> {

    private TextField textField;

    String oldItem="";

    private Connection connection;
    String url = "jdbc:sqlserver://localhost:1433;databaseName=HOGENT1415_11";
    String user = "sa";
    String password = "root";
    Statement statement;

    public TextFieldTreeCellImpl(){
    }

    @Override
    public void startEdit() {
        super.startEdit();

        if (textField == null) {
            createTextField();
        }
        setText(null);
        setGraphic(textField);
        textField.selectAll();
    }

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

    @Override
    public 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(getTreeItem().getGraphic());
            }
        }

    }

    private void createTextField() {
        textField = new TextField(getString());
        textField.setOnKeyReleased(new EventHandler<KeyEvent>() {

            @Override
            public void handle(KeyEvent t) {
                if (t.getCode() == KeyCode.ENTER) {
                    commitEdit(textField.getText());
                } else if (t.getCode() == KeyCode.ESCAPE) {
                    cancelEdit();
                }
            }
        });
    }

    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
}
公共最终类TextFieldTreeCellImpl扩展了TreeCell{
私有文本字段文本字段;
字符串oldItem=“”;
专用连接;
String url=“jdbc:sqlserver://localhost:1433;databaseName=HOGENT1415_11”;
字符串user=“sa”;
字符串password=“root”;
声明;
公共文本字段treecellimpl(){
}
@凌驾
公开作废已启动IT(){
super.startEdit();
if(textField==null){
createTextField();
}
setText(空);
设置图形(文本字段);
textField.selectAll();
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
setText((字符串)getItem());
setGraphic(getTreeItem().getGraphic());
}
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
if(textField!=null){
setText(getString());
}
setText(空);
设置图形(文本字段);
}否则{
setText(getString());
setGraphic(getTreeItem().getGraphic());
}
}
}
私有void createTextField(){
textField=newtextfield(getString());
setOnKeyReleased(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.ENTER){
committedit(textField.getText());
}else if(t.getCode()==KeyCode.ESCAPE){
取消编辑();
}
}
});
}
私有字符串getString(){
返回getItem()==null?”:getItem().toString();
}
}
这是实现神奇效果的代码:

selectionTreeView.setEditable(true);
        selectionTreeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                TextFieldTreeCellImpl textField = null;
                textField = new TextFieldTreeCellImpl();
                return textField;
            }


        });
selectionTreeView.setEditable(true);
selectionTreeView.setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
TextFieldTreeCellImpl textField=null;
textField=new textfieldtreecelimpl();
返回文本字段;
}
});

非常感谢您的帮助。

詹姆斯•德所说的一切正常

所以把所有的树细胞都换成树细胞

还要注意这一行:

commitEdit(textField.getText());
这应成为:

commitEdit(new MyNode(*parameters*));
我不知道MyNode有哪些参数,但例如,如果有int类型的参数,则还需要为此编写一个额外的私有方法(如getString方法):


您需要更改单元格实现,使其成为
TreeCell
。尝试一下(你需要将许多参数的类型从
String
更改为
MyNode
),如果你无法让它工作,请用你尝试过的内容更新你的问题。谢谢,这起作用了,还有其他一些东西(答案中的committedit部分)我忘了做committedit部分,我的错误。现在一切正常,谢谢!
private String getItemInt() {
        return getItem() == null ? "" : getItem().giveItemInt();
    }