2015-11-25 2 views
-1

Все, я делаю настольное приложение с JPanel и JFrame. Вот мое дерево структура:Как изменить цвет Jtree на основе динамического изменения Jtree для приложения для Java-приложений

По умолчанию дерево

@Root 
|-L1B (node-1) 
|-L2A (node-2) 
|-L1A (node-3) 

После этого я читаю файл (допустим, два значения: value1 и value2) и добавить данные листа.

Так, I'de хотел изменить цвет, как это:

@Root 
|**-L1B** (node-1)(with green color) 
    | value1(with green color) 
    | value2(with green color) 
|-L2A (node-2) 
|-L1A (node-3) 

value1 значения может быть 60-й года, а это означает, что в течение 60-х лет он в зеленом, а затем становится красным.

@Root 
|**-L1B** (node-1)(with green color) 
    | value1(with green red) 
    | value2(with green color) 
|-L2A (node-2) 
|-L1A (node-3) 

И после того, как 60-е годы, value2 значение может быть больше, чем 60-е годы value1, так что в течение 60-х годов он будет зеленым, а затем красным.

@Root 
|**-L1B** (node-1)(with green color) 
    | value1(with green red) 
    | value2(with green color) 
|-L2A (node-2) 
|-L1A (node-3) 

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

+0

Я хотел бы взглянуть на [Учебники по Java - Как использовать деревья] (https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html). –

ответ

0

Что вы ищете - это обычная визуализация.

Чтобы сделать это, возьмите JTree и вызовите метод setCellRenderer(), чтобы передать визуализатор.

Основной рендерер является наследованием DefaultTreeCellRenderer. Метод, возвращающий рендеринг, - getTreeCellRendererComponent().

К сожалению, ваш вопрос очень расплывчато, поэтому я не могу дать более конкретный пример, так что общий пример будет:

JTree paintedTree = new JTree(); 
paintedTree.setCellRenderer(new DefaultTreeCellRenderer() { 
    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     Component renderedItem = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
     if (((YourClass)value).getTime() > 60) { 
      renderedItem.setBackground(Color.GREEN); 
     } 

     return renderedItem; 
    } 
}); 

Обратите внимание, что этот ответ строго от предоставления точки окраски зрения. Код для определения, работает ли процесс, был упрощен (((YourClass)value).getTime() > 60), чтобы сохранить ответ в фокусе.

Кроме того, проверьте this. Это может помочь вам в преследовании.

+0

общественный компонент getTreeCellRendererComponent (JTree дерево, значение объекта, булева выбрана, булево расширено, булево лист, внутр строка, логического HasFocus) { // код } я упаковал свой собственный класс рендеринга, и его прекрасно работать .. my quesiotn - это как я снова и снова вызываю этот класс и его getTreeCellRendererComponent() с его разными значениями изменения. – Krunal

+0

@Krunal В этом случае функция 'getTreeCellRendererComponent()' будет вызываться каждый раз, когда вы перерисовываете контейнер. Таким образом, я бы назвал 'repaint()' всякий раз, когда процесс завершается, это вызовет рендеринг, а затем вы сможете проверить, работает ли этот процесс или нет, и отобразить правильный цвет. Надеюсь, это поможет. Дайте мне знать, если это то, что вы имели в виду.Или создайте новый вопрос с правильным кодом, чтобы я мог лучше понять, что вы имеете в виду. – malinator

+0

Я не знаю, как передать значение в настраиваемом классе рендеринга, чтобы я мог просто просто передать мое переданное значение с помощью методов getTreeCellRendererComponent значение param. или есть какой-либо метод, который передаст мои аргументы этому методу thisgetTreeCellRendererComponent(). – Krunal

Смежные вопросы