gpt4 book ai didi

java - Swing ListCellRenderer 的功能

转载 作者:行者123 更新时间:2023-12-04 04:48:03 24 4
gpt4 key购买 nike

关于 JavaDoc for javax.swing.ListCellRenderer 中示例代码的快速问题:

我有点惊讶,在示例中,ListCellRenderer由扩展 JLabel 的类实现并且 getListCellRendererComponent(...) -方法只返回 this .看起来只有一个 JLabel 的实例大约在那时,即使对于包含多个元素的列表也是如此。

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

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

  • 是否 JList以某种方式创建提供的 ListCellRenderer 的新实例每个列表项?
  • 还是使用getListCellRendererComponent(...)返回的组件?只调用它的paint(...)列表 Canvas 上的方法,而不是实际将此组件添加到某个面板?
  • 最佳答案

    JList呈现它自己询问 ListModel对于它应该显示的元素。
    对于每个元素,它调用 javax.swing.ListCellRenderer提供一个渲染组件。然后它绘制组件。就这样。渲染组件不绑定(bind)到它渲染的元素状态。
    ListCellRenderer 的 javadoc说:

    Identifies components that can be used as "rubber stamps" to paint the cells in a JList.



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

    看看 javax.swing.plaf.BasicListUI显示它:
    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);
    }

    关于java - Swing ListCellRenderer 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881421/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com