JavaFX - Как рассматривать TreeItem как TreeCell
В моем приложении JavaFX я хочу запустить метод startEdit(), реализованный в TreeView CellFactory, нажав кнопку в меню. Проблема в том, что я не могу добраться до методов, переданных TreeItem посредством Callback напрямую, и я не вижу другого способа сделать каждый TreeItem редактируемым.
Это код из моей реализации Tree, cellfactory взят из оракула
private class WTree extends TreeView<String> {
private TreeItem<String> rootItem;
private TreeItem<String> sItem;
private TreeItem<String> aItem;
private TreeItem<String> iItem;
private TreeItem<String> uItem;
public WTree() {
super();
rootItem = new TreeItem<String>("Employees");
sItem = new TreeItem<String>("Sales Departament");
aItem = new TreeItem<String>("Accounts Departament");
iItem = new TreeItem<String>("IT Support");
uItem = new TreeItem<String>("Undercover");
this.setRoot(rootItem);
rootItem.getChildren().addAll(sItem, aItem, iItem, uItem);
rootItem.setExpanded(true);
this.setEditable(true);
this.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
}
});
}
}
private final class TextFieldTreeCellImpl extends TreeCell<String> {
private TextField textField;
private boolean focused;
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();
}
}
private class WTextField extends TextField {
public WTextField(String desc) {
super();
this.setPromptText(desc);
this.setPrefWidth(100);
}
}
И мой обработчик из меню
editLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(tree.isFocused()) {
tree.requestFocus();
FocusModel<TreeItem<String>> treeSelect = tree.getFocusModel();
TreeItem<String> foc = treeSelect.getFocusedItem();
}
1 ответ
Я не уверен, что действительно понимаю ваш вопрос полностью, но я думаю, что вы ищете TreeView.edit(...)
метод. Вы можете сделать что-то вроде
editLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
tree.edit(tree.getSelectionModel().getSelectedItem());
}
});