JList 组件中 JCheckBox 的边距

Margin to JCheckBox in a JList component

我有一个 JList 组件,每个项目都有 JCheckBox 渲染器。 我想给复选框添加边距,这样它就不会粘在左侧。

我试过了

checkBox.setMargin(new Insets(0, 10, 0, 0)); //left side spacing

也尝试过

checkBox.setAlignmentX(10.0F);

渲染代码

class ListRenderer() {
   public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
    JCheckBox box = new JCheckBox("Married");
    return box;
   }

}

两个都不行

与其尝试使用 setMargin 方法,不如尝试通过向渲染器添加 EmptyBorder 来实现。此外,如果您在 ListCellRenderer 中 return 一个 new JCheckBox 您的应用程序将使用大量内存(它不会被 return 编辑为 OS),因为每个事件(几乎)组件 fires/bothered 的时间,它正在被重新绘制,因此,创建了新的 *cells JCheckBoxes ..相反,创建一个新的 class extends JCheckBoximplements 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);
        });
    }
}

预览: