2014-04-15 33 views
0

我創建了一個擴展Jidesoft的StyledLabel的自定義ListCellRenderer。我的渲染器使用的JList是固定寬度,因此在我的渲染器中,我嘗試根據此寬度縮短文本。我在getListCellRendererComponent中調用setText,有時候它會起作用。當我選擇一個單元格時,文本就好像我從來沒有縮短過它。沒有與setText和文本縮短相關的分支。爲什麼我的自定義ListCellRenderer忽略了我對setText的調用?

我試圖使用解決方案this somewhat-related answer討論定製渲染和細胞的高度,但它並沒有始終如一地對選擇工作。

編輯:一些代碼

public class CustomListCellRenderer extends StyledLabel implements ListCellRenderer { 

    public Component getListCellRendererComponent(
     JList list, 
     Object value, 
     int index, 
     boolean isSelected, 
     boolean cellHasFocus) { 
    setText(shortenName(value.toString(), 150)); 

    return this; 
} 

    private String shortenName(String name, int width) { 
    if(this.getGraphics() != null) { 
     final FontMetrics fontMetrics = this.getFontMetrics(this.getFont()); 

     String end = name.substring(name.length()/2); 
     String beginning = name.substring(0, name.length()/2); 

     int stringWidth = SwingUtilities.computeStringWidth(fontMetrics, name); 

     if(stringWidth < width) 
      return name; 

     do { 
      end = end.substring(1); 
      beginning = beginning.substring(0, beginning.length() - 1); 

      stringWidth = SwingUtilities.computeStringWidth(fontMetrics, beginning + "..." + end); 
     } while (stringWidth > width); 
     return beginning + "..." + end; 
    } 
    return name; 
    } 
    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JList list = new JList(new String[] { 
      "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
      "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", 
      "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"}); 
    list.setCellRenderer(new CustomListCellRenderer()); 
    frame.getContentPane().add(list); 
    frame.setVisible(true); 
} 
} 
+0

我們發現很難調試代碼時,你不告訴我們您的任何代碼。 – csmckelvey

+0

@Takendarkk添加了一些代碼。 –

+1

不知道爲什麼要擴展StyledLabel。你所做的只是設置文本,爲什麼不擴展默認渲染器?不要忘記調用'super.getListCellRendererComponent(...)',以便獲得默認的高亮行爲。我不會硬編碼字符串的寬度。寬度應該基於JList的寬度。 – camickr

回答

1

在你執行ListCellRenderer你依靠標籤的getGraphics()。有時候,getGraphics()null這是正常的,但你沒有進入if(this.getGraphics() != null)條件,簡單地返回未修改的字符串。這就是爲什麼你會得到不一致的結果。註釋掉這個條件解決了發佈代碼中的問題。你不應該依靠getGraphics()它的價值超出你的控制。

+0

那麼我還可以如何使用FontMetrics?或者我應該放棄這種方法? –

+0

@ tM--不確定你的意思。你使用'getFontMetrics()'得到'FontMetrics'。只要不在'if(this.getGraphics()!= null)'上調整就可以了。 – tenorsax

+1

對不起,我認爲getFontMetrics()出於某種原因依賴於getGraphics()。刪除該條件工作 - 謝謝。 –

相關問題