繁体   English   中英

自定义ListCellRenderer的JList显示错误

[英]JList display error with custom ListCellRenderer

我在JList上使用自定义ListCellRenderer遇到麻烦。 如果“列表”中只有一项,则该单元格将正确显示,但是如果有一项以上,则每个单元格的接缝处将所有单元格的内容相互重叠,如下所示:

在此处输入图片说明

我的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试。 为了解决这个问题,从删除所有组件this每一次,使用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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM