1
我創建了一個顯示文件列表的JTree。這些文件的長度不一樣。 我想在JTree中以相同的長度顯示它們全部,例如20個字符。 如果名稱大於20個字符,它應該出現在工具提示中。如何在相同長度的JTree中顯示所有的String elementName?
我該如何認識它? 下面是我的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;
}
}
我重寫了getPreferredSize以獲取JTree的固定寬度,否則它隨機變大或變小(我在BorderLayout.WEST中添加了JTree)。可能有更好的方法來做到這一點,但我這樣做。任何建議將不勝感激。 – itro
我得到以下錯誤:'線程中的異常「AWT-EventQueue-1」java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:20 \t at java.lang.String.substring(String.java:1765) \t at be.azvub.j2eeoe.util.configtoolscanners.view.FileTreePanel $ FileTreeCellRenderer.getTreeCellRendererComponent(FileTreePanel.java:157) ' – itro
@itro首選大小僅在「DefaultTreeCellRenderer」被詢問組件時返回自身時才起作用。我忽略了這個事實。我會對該例外的答案進行編輯 – Robin