2012-05-03 12 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

我重寫了getPreferredSize以獲取JTree的固定寬度,否則它隨機變大或變小(我在BorderLayout.WEST中添加了JTree)。可能有更好的方法來做到這一點,但我這樣做。任何建議將不勝感激。 – itro

+0

我得到以下錯誤:'線程中的異常「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

+0

@itro首選大小僅在「DefaultTreeCellRenderer」被詢問組件時返回自身時才起作用。我忽略了這個事實。我會對該例外的答案進行編輯 – Robin

相關問題