我正在尝试添加一个我猜你会称之为列表中每个项目的子列表。我已经构建了一个自定义渲染器,它提供了以下输出。你可以看到一些东西不在这里,我没有运气追踪我的问题的答案。我猜我需要更改面板布局中的某些内容以获得正确的结果,但不知道是什么。
http://i.stack.imgur.com/jCKjJ.jpg
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.ListCellRenderer;
import javax.swing.border.EmptyBorder;
public class GAListRendererAdv extends Container implements ListCellRenderer {
private static final long serialVersionUID = 1L;
private JPanel pnl = new JPanel();
private Random rnd = new Random();
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
pnl.setLayout(new BorderLayout(0, 0));
JCheckBox chckbxSomething = new JCheckBox("something");
pnl.add(chckbxSomething, BorderLayout.NORTH);
JSeparator separator = new JSeparator();
pnl.add(separator, BorderLayout.CENTER);
JPanel panel_1 = new JPanel();
panel_1.setBorder(new EmptyBorder(0, 35, 0, 0));
pnl.add(panel_1, BorderLayout.SOUTH);
panel_1.setLayout(new GridLayout(0, 1, 0, 0));
int rndNum = rnd.nextInt(5) + 1;
for (int i = 0; i < rndNum; i ++) {
JLabel lblNewLabel2 = new JLabel("New label");
panel_1.add(lblNewLabel2);
}
return pnl;
}
}
答案 0 :(得分:4)
首先,请记住,CellRenderers
在Swing中用作“橡皮图章”。这样做是为了节省内存并帮助提高性能。这允许组件(如JList
)维护对渲染器的单个引用,但仍然会绘制列表中的所有项目。
这意味着,当调用getListCellRendererComponent
时,渲染器将处于调用它的最后状态。
从我的代码中可以看出,这意味着每次调用渲染器时,都会添加一个ANOTHER复选框,另一个分隔符ANOTHER面板和更多标签...
其次,对于渲染器,尽量不要在getListCellRendererComponent
中创建任何内容,这只会增加内存使用量(部分代码可能无法选择)。
第三,由于我之前所说的原因,JList
不支持编辑,渲染器不是编辑。
Forthly。尝试从面板的“body”部分删除内容,然后再将所有元素添加到其中。
// Don't use Container, use JPanel instead, mixing heavy and light weight components
// is never a good idea :P
public class GAListRendererAdv extends JPanel implements ListCellRenderer {
private static final long serialVersionUID = 1L;
private JPanel pnl = new JPanel();
private Random rnd = new Random();
private JCheckBox checkBox;
public GAListRendererAdv() {
setLayout(new BorderLayout(0, 0));
checkBox = new JCheckBox();
add(checkBox, BorderLayout.NORTH);
add(new JSeparator(), BorderLayout.CENTER);
pnl = new JPanel(new GridLayout(0, 1, 0, 0));
pnl.setBorder(new EmptyBorder(0, 35, 0, 0));
add(pnl BorderLayout.SOUTH); // Don't forget to add the panel :P
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
pnl.removeAll();
int rndNum = rnd.nextInt(5) + 1;
for (int i = 0; i < rndNum; i ++) {
JLabel lblNewLabel2 = new JLabel("New label");
pnl.add(lblNewLabel2);
}
return this;
}