我创建了一个显示文件列表的JTree。这些文件的长度不一样。 我想在JTree中以相同的长度显示它们,例如20个字符。 如果名称大于20个字符,则应显示在工具提示中。
我怎么能意识到这一点? 下面是我的cellRenderer。
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;
}
}
答案 0 :(得分:3)
您可以调整标签上的文字以限制尺寸,例如
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
,因为代码中未使用渲染器是组件的事实。您在getTreeCellRendererComponent
方法