我创建了一个自定义ListCellRenderer,它扩展了Jidesoft的StyledLabel。我的渲染器使用的JList是固定宽度,因此在我的渲染器中,我尝试根据该宽度缩短文本。我在getListCellRendererComponent中调用setText,这有时可以工作。当我选择一个单元格时,文本就像我从未将其缩短一样。没有与setText和text-shortening相关的分支。

我尝试使用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);
}
}

最佳答案

在实现ListCellRenderer时,您依赖于标签的getGraphics()。有时,getGraphics()null可以,但是您没有输入if(this.getGraphics() != null)条件,而只是返回未修改的字符串。这就是为什么您得到不一致的结果的原因。注释掉这种情况解决了已发布代码中的问题。您不应该依赖getGraphics()它的值超出您的控制范围。

09-29 19:19