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);
});
}
}
預覽:
添加回答
舉報