ファイルのリストを表示する 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;
}
}