java - 为什么我的自定义 ListCellRenderer 忽略我对 setText 的调用?

标签 java swing jlist listcellrenderer

我创建了一个自定义 ListCellRenderer 来扩展 Jidesoft 的 StyledLabel。我的渲染器使用的 JList 是固定宽度的,因此在我的渲染器中,我尝试根据此宽度缩短文本。我在 getListCellRendererComponent 中调用 setText,有时会起作用。当我选择一个单元格时,文本的表现就好像我从未缩短过它一样。没有与 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);
}
}

最佳答案

ListCellRenderer 的实现中,您依赖于标签的 getGraphics()。有时,getGraphics()null,这没关系,但您没有输入if(this.getGraphics() != null)条件并简单地返回未修改的字符串。这就是为什么你会得到不一致的结果。注释掉这个条件解决了发布代码中的问题。您不应该依赖 getGraphics(),它的值超出了您的控制范围。

关于java - 为什么我的自定义 ListCellRenderer 忽略我对 setText 的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23093870/

相关文章:

java - Android:传递允许 recyclerview 由特定字符串填充的变量

java - 无法摆脱绘制的线条

Java 2D 游戏 : The game loop

java - JList 使用所有鼠标按钮选择项目

java - 将字符串转换为 JSON 对象数组并解析它们

java - 使用 SimpleXML 进行反序列化的 Android 速度问题

java - 如何在 java swing 中设置 Filepicker 以仅选择特定文件?例如。仅限以 .mo 为扩展名的文件

java - 如何以编程方式控制不同进程中的 Java Swing 应用程序?

java - JList 添加/删除项目

java - 将 JList 与模型一起使用?