首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing ListCellRenderer的功能

Swing ListCellRenderer的功能
EN

Stack Overflow用户
提问于 2013-07-26 12:33:04
回答 1查看 1.2K关注 0票数 2

关于javax.swing.ListCellRenderer中的示例代码的一个快速问题

我有点惊讶,在这个例子中,ListCellRenderer是由一个扩展JLabel的类实现的,而getListCellRendererComponent(...)-method只是返回this。看起来当时只有一个JLabel实例,即使是包含多个元素的列表也是如此。

通常,当setText(...)方法在getListCellRendererComponent(...)中为列表中的第二项调用时,它会更改列表中已经存在的第一项的标签。或者,实际上,列表甚至不可能对列表中的每个项使用相同的JLabel-instance两次(或多次)。

现在,我想出了两种可能的方法来解决这个问题,并想知道哪一种(如果有的话)正在发生:

  • JList是否为每个列表项创建了提供的ListCellRenderer的新实例?
  • 或者它只使用getListCellRendererComponent(...)返回的组件来调用列表画布上的paint(...)方法,而不是实际上将该组件添加到某个面板中?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-26 12:37:46

JList呈现自身时,它向ListModel请求它应该显示的元素。对于每个元素,它调用javax.swing.ListCellRenderer来提供一个呈现组件。然后它绘制组件。就这样。呈现组件不绑定到它呈现的元素的状态。

ListCellRenderer的javadoc说:

标识可用作“橡皮图章”在JList中绘制单元格的组件。

所以你的第二个假设是正确的。

看看javax.swing.plaf.BasicListUI就会发现:

代码语言:javascript
复制
protected void paintCell(Graphics g, int row, Rectangle rowBounds,
        ListCellRenderer cellRenderer, ListModel dataModel,
        ListSelectionModel selModel, int leadIndex) {
    Object value = dataModel.getElementAt(row);
    boolean cellHasFocus = list.hasFocus() && (row == leadIndex);
    boolean isSelected = selModel.isSelectedIndex(row);

    Component rendererComponent = cellRenderer
            .getListCellRendererComponent(list, value, row, isSelected,
                    cellHasFocus);

    int cx = rowBounds.x;
    int cy = rowBounds.y;
    int cw = rowBounds.width;
    int ch = rowBounds.height;

    if (isFileList) {
        // Shrink renderer to preferred size. This is mostly used on Windows
        // where selection is only shown around the file name, instead of
        // across the whole list cell.
        int w = Math
                .min(cw, rendererComponent.getPreferredSize().width + 4);
        if (!isLeftToRight) {
            cx += (cw - w);
        }
        cw = w;
    }

    rendererPane.paintComponent(g, rendererComponent, list, cx, cy, cw, ch,
            true);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17881421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档