2012-05-03 5 views
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; 
    } 
} 

答えて

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

+0

JTreeの固定幅を取得するためにgetPreferredSizeをオーバーライドします。それ以外の場合はランダムに大きくなるか小さくなります(BorderLayout.WESTにJTreeが追加されています)。これを行う良い方法があるかもしれないが、私はこのようにした。どんな提案も感謝します。 – itro

+0

次のエラーが発生しました: 'スレッド内の「AWT-EventQueue-1」の例外java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外にある場合: \t at java.lang.String.substring(String.java:1765) \t at be.azvub.j2eeoe.util.configtoolscanners.view.FileTreePanel $ FileTreeCellRenderer.getTreeCellRendererComponent(FileTreePanel.java:157) ' – itro

+0

@itro推奨サイズは、コンポーネントの入力時に 'DefaultTreeCellRenderer'が返されるため、効果があります。私はその事実を見落とした。そして、私はその例外のために私の答えを編集します – Robin

関連する問題