2015-08-17 5 views
1

Все,набор различных высот JTree строк динамически

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

(1) с помощью setRowHeight (0), так что узел будет запрашивать его текущей ячейки визуализатор

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

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

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

enter image description here

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

ответ

1

(1) и (2) отлично работает для меня с помощью JDK1.8.0_51 на Windows 10:

enter image description here

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

Одна небольшая, но существенная деталь я ушел из .. я используя JTreeTable .. высота строка JTree кажется чтобы быть в порядке, используя код, похожий на ваш. Имея проблемы с сохранением части стола, выровненной с JTree – Strokes