java - 自定义 ListCellRenderer 的 JList 显示错误

标签 java swing listcellrenderer

我在使用 JList 上的自定义 ListCellRenderer 时遇到问题。当 List 中只有 1 个项目时,单元格显示正确,但当项目超过 1 个时,每个单元格接缝被绘制,所有单元格的内容相互重叠,如下所示:

enter image description here

我的 CellRenderer 看起来像这样:

public class SendungsCellRenderer extends JPanel implements ListCellRenderer {

private EmptyBorder eb = new EmptyBorder(5, 2, 5, 2);
private LineBorder lb = new LineBorder(new Color(255,255,255), 5);

@Override
public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {

    uiSendungsbutton p = (uiSendungsbutton) value;
    if(isSelected){
        this.setBackground(new Color(200,200,250));
        this.setBorder(new CompoundBorder(lb, new StrokeBorder(new BasicStroke())));
    }else{
        this.setBackground(new Color(252,252,252));
        this.setBorder(lb);
    }
    this.setLayout(p.getLayout());
    this.add(p.getNamePnl(),BorderLayout.NORTH);
    this.add(p.getKdnrPnl(), BorderLayout.CENTER);
    return this;
    }

}

它是用

设置的
list_Sendung = new JList(getSendungen().toArray());
list_Sendung.setVisibleRowCount(1);
list_Sendung.setValueIsAdjusting(true);
list_Sendung.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list_Sendung.setCellRenderer(new SendungsCellRenderer());

getSendungen() 方法返回 uiSendungsbutton 的 ArrayList。

如何让 JList 正确地在它自己的单元格中显示每个项目?

最佳答案

问题是所有单元格都使用相同的单元格渲染器,并且对于每个新单元格,您再次将组件添加到 this。要解决此问题,请使用 removeAll 每次从 this 中删除所有组件。修复后您的代码将如下所示:

public class SendungsCellRenderer extends JPanel implements ListCellRenderer {

    private EmptyBorder eb = new EmptyBorder(5, 2, 5, 2);
    private LineBorder lb = new LineBorder(new Color(255,255,255), 5);

    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        this.removeAll();
        uiSendungsbutton p = (uiSendungsbutton) value;
        if(isSelected){
            this.setBackground(new Color(200,200,250));
            this.setBorder(new CompoundBorder(lb, new StrokeBorder(new BasicStroke())));
        }else{
            this.setBackground(new Color(252,252,252));
            this.setBorder(lb);
        }
        this.setLayout(p.getLayout());
        this.add(p.getNamePnl(),BorderLayout.NORTH);
        this.add(p.getKdnrPnl(), BorderLayout.CENTER);
        return this;
    }
}

关于java - 自定义 ListCellRenderer 的 JList 显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18073209/

相关文章:

java - 这是使用 Enum 的正确方法吗?

java - 克隆需要澄清 : Shallow copying of objects is NOT just assigning object reference variable to another variable or is it?

java xml document.getTextContent() 保持为空

java - JoptionPane 有时是空白的

Java Swing Applet 在鼠标事件后重绘垃圾

java - 对 JComboBox 使用 setEditable() 时对齐会重置

java - 是否可以通过 Java 中的 Telegram API 进行邮件发送(不是机器人)

java - 在 JTable 中显示行选择器(光标/指针)

java - 更新 JList 组件

java - 将鼠标位置分派(dispatch)给 JList 的自定义单元格渲染器中的组件