【问题标题】:set different jtree row heights dynamically动态设置不同的jtree行高
【发布时间】:2015-08-17 16:42:51
【问题描述】:

全部,

过去两天尝试为 JTree 动态设置不同的行高,但成功率为零。下面是我正在尝试实现的图像...这是我尝试过的:

(1) 使用 setRowHeight(0) 以便节点查询它的当前单元格渲染器

(2) 设置从jtree的单元格渲染器返回的组件的PreferredSize(Dimension d)。

(3) 我现在理解不应该更改渲染器本身的行高。

我看不到如何在同一列上设置不同的单元格渲染器,例如下面的 A 列也许我可以硬编码不同的行高。

任何人都有任何提示或技巧,或者更好的是一个可行的例子,我的头被炸了,我似乎已经用尽了所有其他资源..这应该是可能的,对吧?

【问题讨论】:

    标签: java swing jtree jtreetable treecellrenderer


    【解决方案1】:

    (1)(2)Windows 10 上使用JDK1.8.0_51 对我来说效果很好:

    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;
    //   }
    // }
    

    【讨论】:

    • 我遗漏了一个次要但重要的细节。我使用的是 JTreeTable。使用与您类似的代码,JTree 的行高似乎没问题。无法保持表格部分与 JTree 对齐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2021-12-23
    • 2012-11-14
    • 1970-01-01
    • 2012-04-01
    • 2016-10-19
    相关资源
    最近更新 更多