Я создал собственный ListCellRenderer, который расширяет StyledLabel от Jidesoft. JList, в котором используется мой модуль визуализации, имеет фиксированную ширину, поэтому в моем модуле визуализации я пытаюсь сократить текст на основе этой ширины. Я вызываю setText в getListCellRendererComponent, что иногда работает. Когда я выбираю ячейку, текст ведет себя так, как будто я никогда его не сокращал. Нет ветвления, связанного с setText и сокращением текста.
Я попытался использовать решения в этом несколько связанном ответе, обсуждая пользовательский рендеринг и высоту ячеек, но это не работало последовательно. при выборе либо.
редактировать: какой-то код
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);
}
}
super.getListCellRendererComponent(...)
, чтобы получить поведение выделения по умолчанию. Я бы не стал жестко кодировать ширину строки. Ширина должна основываться на ширине JList. - person camickr   schedule 16.04.2014