Обновление цвета фона узлов JTree во время выполнения - PullRequest
0 голосов
/ 17 ноября 2009

Мне нужно изменить цвет узлов дерева, когда бизнес-логика обновляет модель, подождать 1 секунду, а затем снова изменить ее цвет.

В основном я хотел бы создать аналогичную вещь, как здесь Изменение цвета строки JList во время выполнения , но для JTree.

Таким образом, я мог бы использовать подобную технику, но я также не стал менять цвет узлов-предков, чтобы пользователь мог видеть уведомление, даже если оно не расширено.

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Во-первых, когда бизнес-модель обновляется, убедитесь, что вы запустили соответствующее событие обновления дерева в своей древовидной модели, чтобы JTree узнал об обновлении.

Тогда вам нужно определить TreeCellRenderer, который устанавливает цвет. Когда бизнес-модель будет обновлена, сообщите вашему средству визуализации, какие узлы выделить.

Однако уловка здесь состоит в том, чтобы выключить цвет. Вы можете определить Thread или, что еще лучше, Executor, чтобы он спал в течение 1000 миллисекунд, затем велит рендереру больше не выделять узлы, затем снова запускают события обновления дерева, чтобы JTree перерисовывался соответствующим образом.

1 голос
/ 18 ноября 2009

Отметьте это Выделите потомков узла в JTree

Вы можете легко изменить его, чтобы вместо этого выделить родительский элемент, и теперь вам нужно только подключить решение для выделенного времени, как решение, которое я предоставил в другом потоке. Подсветка, таймер, неустановленная подсветка.

Использование SwingWorker плюс, возможно, Исполнитель , если обновления модели происходят часто и требуется некоторый контроль над выполнением потоков подсветки

0 голосов
/ 28 октября 2014

Это должно быть улучшено с помощью SwingWorker, чтобы через какое-то время цвет не возвращался:

  class RuntimeTreeRender extends DefaultTreeCellRenderer {


    boolean specialColor = false;

    @Override
    public Color getBackgroundNonSelectionColor() {
        if(specialColor) {
            return Color.GREEN;
        } else {
            return null;
        }
    }


    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) {

        Component c = super.getTreeCellRendererComponent(tree, value, arg2, arg3, arg4, arg5, arg6);

            DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;

                if(YOUR_CONDITION_ON_NODE) { // for exammple : node.getUserObject().toString().contains("a")
                    specialColor = true;
                } else {
                    specialColor = false;
                }

        return c;
    }

}

...