问题描述
我有一个JList,我需要向其中添加组件。 我所做的是我制作了一个DefaultListModel,它采用了我制作的组件的类型。 我的代码将其添加到DefaultListModel,并且确实显示信息,但它只是String格式的组件名称。 我应该如何使其实际显示组件而不是组件名称? 可能吗
这是我的代码
DefaultListModel<CustomComponent> jListModel = new DefaultListModel<>();
jListModel.addElement(new CustomComponent()); //Adds the name of the component(not what I want)
1楼
在方法中实现ListCellRenderer类
Component getListCellRendererComponent(
JList<? extends E> list,
E value,
int index,
boolean isSelected,
boolean cellHasFocus);
您需要做的就是返回value
。
在您的情况下,值为list元素是CustomComponent实例。
这是最简单的方法。
但这不是正确的方法。
列表模型应保留数据(而非组件)。
而是为渲染器定义一个CustomComponent实例,然后在getListCellRendererComponent()
调用诸如customComponentInstance.init(value)
以使CustomComponent反映模型中的数据。
2楼
有可能的。 您需要编写自己的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