TreeCell не обновлять цвет шрифта - PullRequest
1 голос
/ 18 марта 2020

У меня есть 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;
        }
    }
}

Может кто-нибудь сказать мне, что мне не хватает, или я делаю что-то в корне неправильно?

1 Ответ

0 голосов
/ 18 марта 2020

Когда вы начинаете редактировать новый TreeCell, вы можете изменить цвет предыдущего после отмены его редактирования:

@Override
public void startEdit() {
    super.startEdit();
    System.out.println("EDIT");
    if(getItem().type.equals("level"))
    {
        if(previous!=null) // Check if previous exists
        {
            previous.cancelEdit(); //Cancel edit
            previous.setTextFill(Color.BLACK); // Reset color
        }
        previous=this;
        getItem().flag=true;
        commitEdit(getItem());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...