制作自定义ListCellRenderer:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
/**
*
* @author Spencer
*/
public class TaskRenderer implements ListCellRenderer {
private Task task;
private JPanel panel = new JPanel();
private JCheckBox checkbox = new JCheckBox();
private JLabel label = new JLabel();
public TaskRenderer() {
panel.add(checkbox);
panel.add(label);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
task = (Task) value;
label.setText(task.getName());
return panel;
}
}
使用上面的类渲染其中每个单元格的JList,但不能单击每个单元格的面板中的复选框。认为它与它没有获得焦点有关。有什么想法吗?
谢谢, 斯潘塞
答案 0 :(得分:2)
您的自定义渲染器只是控制JList内容的外观,而不是添加任何功能,例如修改组件的功能(复选框) - 想象它只是用于依次显示每个列表单元格的橡皮图章。 / p>
我建议通过以下方式解决问题:
答案 1 :(得分:0)
JIDE Common Layer有一个GPL'CheckBoxList。基本上它使用JPanel作为单元格渲染器,在另一个渲染器(您可以自己设置)前面放置JCheckBox,并处理鼠标/键事件。
如果你真的想坚持使用JCheckBox渲染器,你可以听取鼠标/键事件并适当地处理它们。请记住,正如Adamski指出的那样,单元格渲染器是一个橡皮图章(Swing 101),因此您必须始终在getListCellRendererComponent()
中设置复选框选中状态,否则所有复选框都将具有保存状态。