Java 自定义ListCellRenderer的JList显示错误

Java 自定义ListCellRenderer的JList显示错误,java,swing,listcellrenderer,Java,Swing,Listcellrenderer,我在使用JList上的自定义ListCellRenderer时遇到问题。当列表中只有一个项目时,单元格将正确显示,但当有多个项目时,每个单元格接缝将绘制,所有单元格的内容将相互重叠,如下所示: public class SendungsCellRenderer extends JPanel implements ListCellRenderer { private EmptyBorder eb = new EmptyBorder(5, 2, 5, 2); private LineBorder

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

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;
    }

}

我的手机是这样的:

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
的数组列表


如何使JList在其自身的单元格中正确显示每个项目?

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

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;
    }
}

不要将组件存储在JList中,而是存储应该存储的数据rendered@kleopatra:这是有道理的。谢谢。看看这里:我也面临着类似的问题。这可能会有帮助。@LuigiEdlCarno not,error decision,遗忘,don don to set,add,remove,change
JComponent
及其状态/属性在
XxxRenderer
中,请参见,在每次调用时使用JTable(一列没有JTableHeader)而不是JList-1来创建新组件(并支持OP将组件列入列表的错误行为;-)+1作为解释。我应该自己解决这个问题。我想如果有人真的想要重叠单元格,他们只需要为每个单元格使用相同的CellRenderer实例。-1,出于与@kleopatra相同的原因,你不应该在
GetListCellRenderComponent
中创建新组件。窗格
之后的每个代码行。setOrder(lb);
将杀死
渲染器概念
,同意否决票:-),不要在
XxxRenderer
中设置、添加、删除、更改
JComponent
及其状态/属性,请参见@LuigidelCarno CellRenders旨在重复使用,也就是说,它是非常好的,目的是具有相同的渲染组件实例。即使您将组件作为数据(不要:-),只要您再次删除它们,这也会起作用:否则可能会有像f.i.这样的不可预测的绘画艺术品。只是为了好玩,让你的旧渲染器有一个FlowLayout。。。