我創建了一個擴展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);
}
}
我們發現很難調試代碼時,你不告訴我們您的任何代碼。 – csmckelvey
@Takendarkk添加了一些代碼。 –
不知道爲什麼要擴展StyledLabel。你所做的只是設置文本,爲什麼不擴展默認渲染器?不要忘記調用'super.getListCellRendererComponent(...)',以便獲得默認的高亮行爲。我不會硬編碼字符串的寬度。寬度應該基於JList的寬度。 – camickr