TreeCellRenderer ест процессор - PullRequest
       8

TreeCellRenderer ест процессор

1 голос
/ 14 февраля 2012

У меня есть простой TreeCellRenderer, который извлекает JButton из узла и выводит его на JTree.

public class ButtonCellRenderer extends JButton implements TreeCellRenderer {

  @Override
  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean     selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    //setBackgroundNonSelectionColor(tree.getBackground());
    ProgressButton b = null;
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
      Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
      if (userObject instanceof ProgressButton) {
        b = (ProgressButton) userObject;
        return b;
      }
    }
    if (b == null) {
      System.out.println("Null!");
      DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
      return defaultRenderer.getTreeCellRendererComponent(tree,
              value, selected, expanded, leaf, row, hasFocus);
    } else {
      System.out.println("Returning label");
      return new JLabel(b.getToolTipText(), b.getIcon(), SwingConstants.CENTER);
    }
  }
}

Я не уверен, почему, но кажется, что он застрял в цикле и потребляет около 30 ~ 50% ресурсов процессора. Есть ли способ устранить это? Или не нужно использовать средство визуализации для вывода JButton в дерево?

Я добавил исправленный код выше, но теперь у меня возникает проблема, когда кнопки не отображаются должным образом (все они выглядят маленькими). ​​

1 Ответ

5 голосов
/ 14 февраля 2012

Вы звоните super.getTreeCellRendererComponent без сохранения значения.Если позднее средство визуализации не создается, вы вызываете этот метод снова (if c==null...).Это дорого для себя.

Более важно:

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

Вы создаете новый JLabel каждый раз, когда отображаете значение:returnLab = new JLabel(text);.Это дорогоЭтот метод будет вызываться для каждой ячейки, отображаемой в каждом событии перерисовки.Это намного дороже, чем построение сетки компонентов, и не соответствует всей цели концепции рендерера.

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

...