Java 如何在JTree中以相同的长度显示所有String elementName?
我创建了一个JTree,其中显示了文件列表。这些文件的长度不同。 我想在JTree中显示所有长度相同的字符,例如20个字符。 如果名称大于20个字符,则应显示在工具提示中 我怎样才能实现它? 下面是我的手机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
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
返回自身时才有效。我忽略了这一事实。我将对该异常的答案进行编辑