首先,请记住,CellRenderers
在 Swing 中用作“橡皮图章”。这样做是为了节省内存并帮助提高性能。这允许组件,例如JList
,以维护对渲染器的单个引用,但仍绘制列表中的所有项目。
这意味着,无论何时getListCellRendererComponent
被调用时,渲染器将处于与上次调用时相同的状态。
从我从你的代码中可以看出,这意味着每次调用渲染器时,你都会添加另一个复选框、另一个分隔符、另一个面板和更多标签......
其次,对于渲染器,尽量不要在渲染器中创建任何东西getListCellRendererComponent
在可能的情况下,这只会增加您的内存使用量(您的部分代码可能没有选择)。
第三,JList
不支持编辑器,渲染器不是编辑器,原因我之前已经说过。
第四。在将所有元素添加到其中之前,请尝试从面板的“主体”部分中删除内容。
// 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;
}