【问题标题】:JList display error with custom ListCellRenderer自定义 ListCellRenderer 的 JList 显示错误
【发布时间】:2013-08-06 06:37:04
【问题描述】:

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

我的 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 在自己的单元格中正确显示每个项目?

【问题讨论】:

  • 不要在 JList 中存储组件,而是存储应该呈现的数据
  • @kleopatra:这是有道理的。谢谢。
  • 看看这里:stackoverflow.com/questions/6042955/… 我遇到了类似的问题。这可能会有所帮助。
  • @LuigiEdlCarno 不是,错误的决定,忘记了,不要设置,添加,删除,更改JComponent 及其在XxxRenderer 中的状态/属性,请参阅code how can/could be this idea works,使用JTable(一列没有 JTableHeader)而不是 JList

标签: java swing listcellrenderer


【解决方案1】:

问题是所有单元格都使用相同的单元格渲染器,并且对于每个新单元格,您再次将组件添加到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;
    }
}

【讨论】:

  • -1 用于在每次调用时创建一个新组件(并支持 OP 在他/她在列表中包含组件的错误行为 ;-)
  • +1 用于解释。我应该自己想到这一点。我猜如果有人真的想要重叠单元格,他们只需要为每个单元格使用相同的 CellRenderer 实例。
  • -1,出于与@kleopatra 相同的原因,您不应在getListCellRendererComponent 中创建新组件。
  • pane.setBorder(lb); 之后的每一行代码都会杀死Renderers Concept,同意down_vote :-),不要在@ 中设置、添加、删除、更改JComponent 及其状态/属性987654330@,请看code how can/could be this idea works
  • @LuigiEdlCarno cellRenderers 设计 可重复使用,也就是说它非常好,并且旨在拥有相同的渲染组件实例。即使您将组件作为数据(不要不要:-),只要您再次删除它们,这也有效:否则可能会出现不可预测的绘画伪影,例如 f.i.你的。只是为了好玩,让你的旧渲染器有一个 FlowLayout ...
猜你喜欢
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多