2

当树展开并且我尝试重命名树节点时,并非所有名称仅显示大约 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;
    }
} 
4

1 回答 1

0
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);
  }
于 2011-10-11T20:16:31.860 回答