如何将 CellFactories 用于 TreeItem<MyNode> 而不是 TreeItem<String>
How to use CellFactories for TreeItem<MyNode> instead of TreeItem<String>
我正在使用以下代码使某些 treeItems 在有人双击它时可以直接在 treeview 本身中进行编辑。最近我更改了我的 TreeView,以便它填充 TreeItem<MyNode>
而不是 TreeItem<String>
。可编辑单元格的代码现在无法使用,我不知道应该更改什么:
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();
}
}
这是神奇的代码:
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;
}
});
非常感谢帮助。
James_D 所说的通常有效。
因此将所有 TreeCell 更改为 TreeCell。
另外注意这一行:
commitEdit(textField.getText());
这应该变成:
commitEdit(new MyNode(*parameters*));
我不知道你的 MyNode 有哪些参数,但是例如,如果你有一个 int 类型的参数,你还需要为此编写一个额外的私有方法(比如 getString 方法):
private String getItemInt() {
return getItem() == null ? "" : getItem().giveItemInt();
}
我正在使用以下代码使某些 treeItems 在有人双击它时可以直接在 treeview 本身中进行编辑。最近我更改了我的 TreeView,以便它填充 TreeItem<MyNode>
而不是 TreeItem<String>
。可编辑单元格的代码现在无法使用,我不知道应该更改什么:
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();
}
}
这是神奇的代码:
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;
}
});
非常感谢帮助。
James_D 所说的通常有效。
因此将所有 TreeCell 更改为 TreeCell。
另外注意这一行:
commitEdit(textField.getText());
这应该变成:
commitEdit(new MyNode(*parameters*));
我不知道你的 MyNode 有哪些参数,但是例如,如果你有一个 int 类型的参数,你还需要为此编写一个额外的私有方法(比如 getString 方法):
private String getItemInt() {
return getItem() == null ? "" : getItem().giveItemInt();
}