Динамически устанавливать разные высоты строк

Все,

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

(1) использование setRowHeight(0), чтобы узел запрашивал текущее отображение ячейки

(2) установка PreferredSize(Dimension d) компонента, возвращаемого из средства визуализации ячеек jtree.

(3) изменение высоты строки в самом рендере, что, как я понимаю, не должно быть сделано.

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

введите описание изображения здесь

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

1 ответ

(1) а также (2) отлично работает для меня, используя JDK1.8.0_51 на Windows 10:

введите описание изображения здесь

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;

public class RowHeightsDynamicallyTest {
  public JComponent makeUI() {
    JTree tree = new JTree() {
      @Override public void updateUI() {
        setCellRenderer(null);
        super.updateUI();
        setCellRenderer(new RowHeightsDynamicallyRenderer());
        setRowHeight(0);
        setRootVisible(false);
        setShowsRootHandles(false);
      }
    };
    return new JScrollPane(tree);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    try {
      for (UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(laf.getName())) {
          UIManager.setLookAndFeel(laf.getClassName());
        }
      }
    } catch (ClassNotFoundException | InstantiationException
               | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      ex.printStackTrace();
    }
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new RowHeightsDynamicallyTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

class RowHeightsDynamicallyRenderer extends DefaultTreeCellRenderer {
  private int height;
  @Override public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean selected,
      boolean expanded, boolean leaf, int row, boolean hasFocus) {
    JLabel l = (JLabel) super.getTreeCellRendererComponent(
        tree, value, selected, expanded, leaf, row, hasFocus);
    l.setFont(tree.getFont().deriveFont(leaf ? 16f : 48f));

    height = leaf ? 20 : 60;
    //use dummy height Icon: l.setIcon(new DummyHeightIcon(height));
    //use <td> height: l.setText(String.format("<html><table><tr><td height='%d'>%s", height, value));
    return l;
  }
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.height = height;
    return d;
  }
}

// class DummyHeightIcon implements Icon {
//   private final int height;
//   public DummyHeightIcon(int height) {
//     this.height = height;
//   }
//   @Override public void paintIcon(Component c, Graphics g, int x, int y) {}
//   @Override public int getIconWidth() {
//     return 0;
//   }
//   @Override public int getIconHeight() {
//     return height;
//   }
// }
Другие вопросы по тегам