Расширенный рендеринг JTree - PullRequest
       16

Расширенный рендеринг JTree

2 голосов
/ 21 августа 2011

Когда дерево раскрыто, и я попытался переименовать узел дерева, не все имена отображали только 4 5 букв, а остальные как (...), но если дерево свернуто, все в порядке.Вот мой пользовательский рендер ячейки дерева:

public class customTreeCellRenderer extends DefaultTreeCellRenderer {
    public Component getTreeCellRendererComponent(JTree tree,
        Object value, boolean selected, boolean expanded,
        boolean leaf, int row, boolean hasFocus){

        super.getTreeCellRendererComponent(tree, value,
        selected, expanded, leaf, row, hasFocus);
        JLabel label = (JLabel) this ;


        label.setSize(label.getHeight(),value.toString().length());
        label.setText(value.toString());
        label.repaint();
        tree.revalidate();
        this.repaint();
        System.out.println("expanded "+expanded);
        System.out.println("Custom  "+ value.toString());

        return label;
    }
} 

1 Ответ

0 голосов
/ 12 октября 2011
label.setSize(label.getHeight(),value.toString().length());
  1. Этот метод принимает ширину и высоту, вы переключили оба параметра.
  2. String.length () возвращает только количество букв, а не размер отображаемой строки.Если вы хотите получить ширину строки, отображаемой с помощью шрифта DefaultRenderer, используйте getFont().getStringBounds("yourString", getFontMetrics(getFont()).getFontRenderContext()).getWidth();

. Вы можете попробовать это:

  if (label.getGraphics() != null) {
    final Rectangle2D r = getGraphics().getFontMetrics(getFont())
        .getStringBounds(value.toString(), getGraphics());

    final Dimension d = new Dimension((int) r.getWidth()
        + getIcon().getIconWidth() + getIconTextGap(), (int) r.getHeight());

    label.setMaximumSize(d);
    label.setPreferredSize(d);
    label.setMinimumSize(d);
  }
...