Java 如何在JTree中以相同的长度显示所有String elementName?

Java 如何在JTree中以相同的长度显示所有String elementName?,java,swing,jtree,cellrenderer,Java,Swing,Jtree,Cellrenderer,我创建了一个JTree,其中显示了文件列表。这些文件的长度不同。 我想在JTree中显示所有长度相同的字符,例如20个字符。 如果名称大于20个字符,则应显示在工具提示中 我怎样才能实现它? 下面是我的手机 private static class FileTreeCellRenderer extends DefaultTreeCellRenderer { private Map<String, Icon> iconCache = new HashMap<String

我创建了一个JTree,其中显示了文件列表。这些文件的长度不同。 我想在JTree中显示所有长度相同的字符,例如20个字符。 如果名称大于20个字符,则应显示在工具提示中

我怎样才能实现它? 下面是我的手机

 private static class FileTreeCellRenderer extends DefaultTreeCellRenderer {
    private Map<String, Icon> iconCache = new HashMap<String, Icon>();
    private Map<File, String> rootNameCache = new HashMap<File, String>();

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                  boolean sel, boolean expanded, boolean leaf, int row,
                                                  boolean hasFocus) {

        FileTreeNode ftn = (FileTreeNode) value;
        File file = ftn.file;
        String filename = "";
        if (file != null) {
            if (ftn.isFileSystemRoot) {
                filename = this.rootNameCache.get(file);
                if (filename == null) {
                    filename = fsv.getSystemDisplayName(file);
                    this.rootNameCache.put(file, filename);
                }
            } else {
                filename = file.getName();
            }
        }
        JLabel result = (JLabel) super.getTreeCellRendererComponent(tree,
                filename, sel, expanded, leaf, row, hasFocus);
        if (sel)
            this.setFont(getFont().deriveFont(Font.BOLD));
        else
            this.setFont(getFont().deriveFont(Font.PLAIN));
        if (file != null) {
            Icon icon = this.iconCache.get(filename);
            if (icon == null) {
                icon = fsv.getSystemIcon(file);
                this.iconCache.put(filename, icon);
            }
            result.setIcon(icon);
        }
        return result;
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension dim = super.getPreferredSize();
        FontMetrics fm = getFontMetrics(getFont());
        char[] chars = getText().toCharArray();

        int w = getIconTextGap() + 40;
        for (char ch : chars)  {
            w += fm.charWidth(ch);
        }
        w += getText().length();
        dim.width = w;
        return dim;
    }
}
私有静态类FileTreeCellRenderer扩展了DefaultTreeCellRenderer{
私有映射iconCache=新HashMap();
私有映射rootNameCache=newhashmap();
@凌驾
公共组件GetTreeCellRenderComponent(JTree树,对象值,
布尔sel、布尔扩展、布尔叶、整数行、,
布尔值(焦点){
FileTreeNode ftn=(FileTreeNode)值;
File File=ftn.File;
字符串filename=“”;
如果(文件!=null){
if(ftn.isFileSystemRoot){
filename=this.rootNameCache.get(文件);
如果(文件名==null){
filename=fsv.getSystemDisplayName(文件);
this.rootNameCache.put(文件名);
}
}否则{
filename=file.getName();
}
}
JLabel结果=(JLabel)super.GetTreeCellRenderComponent(树,
文件名、sel、展开、叶、行、焦点);
如果(sel)
这个.setFont(getFont().deriveFont(Font.BOLD));
其他的
这个.setFont(getFont().deriveFont(Font.PLAIN));
如果(文件!=null){
Icon-Icon=this.iconCache.get(文件名);
如果(图标==null){
icon=fsv.getSystemIcon(文件);
this.iconCache.put(文件名,图标);
}
结果:设置图标(图标);
}
返回结果;
}
@凌驾
公共维度getPreferredSize(){
维度dim=super.getPreferredSize();
FontMetrics fm=getFontMetrics(getFont());
char[]chars=getText().toCharArray();
int w=getIconTextGap()+40;
for(char ch:chars){
w+=调频字符宽度(ch);
}
w+=getText().length();
尺寸宽度=w;
返回暗淡;
}
}

您可以调整标签上的文字以限制大小,例如:

JLabel result = (JLabel) super.getTreeCellRendererComponent(tree,
                filename, sel, expanded, leaf, row, hasFocus);
result.setText( fileName.subString( 0, Math.min( 20, fileName.length() ) );
result.setTooltip( fileName );
注:


您可以毫无理由地重写
getPreferredSize
,因为渲染器是一个组件这一事实并没有在代码中使用。在
getTreeCellRenderComponent
方法中返回一个标签

I覆盖getPreferredSize以获得JTree的固定宽度,否则它会随机变大或变小(我在BorderLayout.WEST中添加了JTree)。也许有更好的方法,但我就是这样做的。任何建议都将不胜感激。我得到以下错误:''Exception in thread“AWT-EventQueue-1”java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.substring(String.java:1765)at be.azvub.j2eeoe.util.configtoolscanners.view.FileTreePanel$FileTreeCellRenderer.GettreeCellRenderComponent(FileTreePanel.java:157)'@itro首选大小只有在要求组件时
DefaultTreeCellRenderer
返回自身时才有效。我忽略了这一事实。我将对该异常的答案进行编辑