1

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

1 に答える 1

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メソッドでラベルを返します

于 2012-05-03T12:37:25.153 に答える