使用 DefaultListCellRenderer 将图标渲染到 JList 的右侧

Render icon to the right side in the JList using DefaultListCellRenderer

我的程序中有一个 DefaultListCellRenderer,它可以很好地完成所有工作,但我想知道我是否可以将图像添加到 JList 的最右侧,而不是将其添加到左侧.

是否可以使用 DefaultListCellRendererJList 中将图标渲染到右侧?

如果是,请帮助我在以下代码中使用它。

public class RCellRenderer extends DefaultListCellRenderer {

    String runm = "";

    public RCellRenderer(String runm) {
        this.runm = runm;

    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        ImageIcon imageIcon = new ImageIcon("images/in.png");
        setIcon(imageIcon);
        if (value.equals(runm)) {
            Color fg = Color.BLACK;
            setForeground(fg);
        }


        return c;
    }

}

渲染器中使用的默认组件是 JLabel,因此调用 JLabel.setHorizontalTextPosition(SwingConstants.WHATEVER)

want the text to the left edge and the icon to the right edge

JList 的默认渲染器是 JLabel。 JLabel 不支持文本和图标之间的动态间隙(只有固定间隙)。

您有两个选择:

  1. 您可以尝试使差距动态化。您设置标签的 text/icon 并获得其首选大小。您还知道 JList 的大小,您可以计算出文本和图标之间的差距。然后调用 setIconTextGap(...) 方法来设置间隙。在调用 super.getCellRendererComponent(...) 方法之前,您还需要将此间隙设置为 0。您还需要使用 Andrew 的建议将图标对齐到文本的右侧。

  2. 使用使用 JPanel 作为渲染器的自定义渲染器。然后,您将为面板使用 BorderLayout。您可以将 "textLabel" 添加到面板的 BorderLayout.LINESTART 并将 "iconLabel" 添加到面板的 BorderLayout.LINE_END。然后在渲染代码中,您只需设置两个标签的 text/icon 即可。您还需要为列表的选定行实现突出显示代码。