当前位置: 代码迷 >> java >> Java / Swing-将组件添加到JList
  详细解决方案

Java / Swing-将组件添加到JList

热度:63   发布时间:2023-07-25 19:28:57.0

我有一个JList,我需要向其中添加组件。 我所做的是我制作了一个DefaultListModel,它采用了我制作的组件的类型。 我的代码将其添加到DefaultListModel,并且确实显示信息,但它只是String格式的组件名称。 我应该如何使其实际显示组件而不是组件名称? 可能吗

这是我的代码

    DefaultListModel<CustomComponent> jListModel = new DefaultListModel<>();
jListModel.addElement(new CustomComponent()); //Adds the name of the component(not what I want)

在方法中实现ListCellRenderer类

Component getListCellRendererComponent(
    JList<? extends E> list,
    E value,
    int index,
    boolean isSelected,
    boolean cellHasFocus);

您需要做的就是返回value 在您的情况下,值为list元素是CustomComponent实例。 这是最简单的方法。

但这不是正确的方法。 列表模型应保留数据(而非组件)。 而是为渲染器定义一个CustomComponent实例,然后在getListCellRendererComponent()调用诸如customComponentInstance.init(value)以使CustomComponent反映模型中的数据。

有可能的。 您需要编写自己的ListCellRenderer,它返回您的Component,而不是默认的JLabel。

例:

public class ComponentListCellRenderer {

    public ComponentListCellRenderer() {
    }

    public Component getListCellRendererComponent(JList<?> list, Object value, int            index, boolean isSelected, boolean cellHasFocus) {
    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof Component){
            c = (Component) value;
            c.setPreferredSize(c.getSize());
        }

        return c;
    }

}

在这种情况下,默认的Component c被拦截并与您自己的Component交换,该组件将为value 我们需要将组件的preferred size设置为其大小,否则JList将无法正确显示组件。

如何使用:

  • 创建一个新的JList<CustomComponent>()
  • 将其ListCellRenderer设置为新的ComponentListCellRenderer
  相关解决方案