У меня есть TreeView
с кратным TreeItem<Object>
. Моя цель - изменить цвет шрифта TreeCell
по двойному щелчку. При повторном щелчке по другому TreeCell
цвет переходит к этому новому TreeCell
и восстанавливает цвет по умолчанию из предыдущего. Моя проблема в том, что цвет меняется, но предыдущий не восстанавливается. Цвет меняется только тогда, когда я выбираю предыдущий. Вот мой MWE:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TreeViewTest extends Application {
private TreeCell<TreeData> previous;
@Override
public void start(Stage primaryStage) throws Exception {
TreeView<TreeData> treeView = new TreeView<>();
treeView.setEditable(true);
TreeItem<TreeData> root = new TreeItem<>(new TreeData("root", "root"));
root.setExpanded(true);
for (int i = 0; i <= 4; i++) {
TreeItem<TreeData> level1 = new TreeItem<>(new TreeData("Number " + i, "level"));
level1.setExpanded(true);
for (int j = 0; j <= 2; j++)
level1.getChildren().add(new TreeItem<>(new TreeData("Subnumber " + i + "." + j, "child")));
root.getChildren().add(level1);
}
treeView.setRoot(root);
treeView.setCellFactory(tv -> {
TreeCellImpl treeCell = new TreeCellImpl();
treeCell.addEventFilter(MouseEvent.MOUSE_PRESSED, (MouseEvent e) -> {
TreeData cellItem = ((TreeCellImpl) e.getSource()).getItem();
// disable double click expand/collapse
if (e.getClickCount() % 2 == 0 && e.getButton().equals(MouseButton.PRIMARY)) {
if (cellItem.type.equals("root") || cellItem.type.equals("level"))
e.consume();
}
// on one double click
if (e.getClickCount() == 2 && e.getButton().equals(MouseButton.PRIMARY)
&& cellItem.type.equals("level")) {
// go into edit mode
treeView.edit(((TreeCellImpl) e.getSource()).getTreeItem());
}
});
return treeCell;
});
primaryStage.setScene(new Scene(treeView));
primaryStage.show();
}
private final class TreeCellImpl extends TreeCell<TreeData> {
@Override
protected void updateItem(TreeData item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
} else {
setText(item.toString());
setTextFill(Color.BLACK);
if (getItem().type.equals("level") && getItem().flag)
setTextFill(Color.GREEN);
}
setGraphic(null);
}
@Override
public void startEdit() {
super.startEdit();
System.out.println("EDIT");
if (getItem().type.equals("level")) {
if (previous != null)
previous.cancelEdit();
previous = this;
getItem().flag = true;
commitEdit(getItem());
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
System.out.println("CANCEL");
if (getItem().type.equals("level")) {
getItem().flag = false;
commitEdit(getItem());
}
}
}
private static final class TreeData {
String text;
String type;
boolean flag;
public TreeData(String text, String type) {
this.text = text;
this.type = type;
}
@Override
public String toString() {
return text;
}
}
}
Может кто-нибудь сказать мне, что мне не хватает, или я делаю что-то в корне неправильно?