1 回答
TA贡献1818条经验 获得超8个赞
不要尝试使用setMargin
方法来完成此操作,而是尝试通过EmptyBorder
向渲染器添加 an 来完成此操作。new JCheckBox
另外,如果您在应用程序中返回 aListCellRenderer
将使用大量内存(它将不会返回到操作系统),因为每次(几乎)组件被事件触发/干扰时,它都会被重新绘制,因此会产生新的 *cells JCheckBox 已创建。相反,创建一个新类extends JCheckBox
和implements ListCellRenderer
。另外,检查setIconTextGap
方法。你可能想使用它:)
一个完整的例子:
public class CheckBoxInJList extends JFrame {
private static final long serialVersionUID = -1662279563193298340L;
public CheckBoxInJList() {
super("test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
DefaultListModel<String> model;
JList<String> list = new JList<>(model = new DefaultListModel<>());
for (int i = 0; i < 1000; i++) {
String s = "String: " + i + ".";
model.addElement(s);
}
list.setCellRenderer(new CheckBoxRenderer());
add(new JScrollPane(list), BorderLayout.CENTER);
setSize(500, 500);
setLocationRelativeTo(null);
}
private static class CheckBoxRenderer extends JCheckBox implements ListCellRenderer<String> {
public CheckBoxRenderer() {
super();
setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0));
}
@Override
public Component getListCellRendererComponent(JList<? extends String> list, String value, int index,
boolean isSelected, boolean cellHasFocus) {
setText(value);
setSelected(isSelected);
return this;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new CheckBoxInJList().setVisible(true);
});
}
}
预览:
添加回答
举报