ZetCode

选择和取消选择所有 JCheckBox 组件

最后修改于 2020 年 7 月 13 日

在本教程中,我们将展示如何在 Swing 应用程序中选择和取消选择所有 JCheckBox 组件。

Swing 是首屈一指的 Java GUI 工具包。它是 JFC(Java Foundation Classes)的一部分,JFC 是一个为 Java 程序提供图形用户界面的 API。Swing 完全用 Java 编写。ZetCode 上有一个简洁的Java Swing 教程

JCheckBox 是一个可以被选中或取消选中的组件,它向用户显示其状态。您可以在 Java Swing 教程的“基本 Swing 组件 II”章节中找到更多关于 JCheckBox 的信息。

setSelected 方法用于选择和取消选择 JCheckBox。以下示例展示了如何在应用程序中选择和取消选择所有 JCheckBox

com/zetcode/CheckUncheckEx.java
package com.zetcode;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import net.miginfocom.swing.MigLayout;

public class CheckUncheckEx extends JFrame {

    public CheckUncheckEx() {

        initUI();
    }

    private void initUI() {

        setLayout(new MigLayout("nogrid"));

        JCheckBox box1 = new JCheckBox();
        JCheckBox box2 = new JCheckBox();
        JCheckBox box3 = new JCheckBox();
        JCheckBox box4 = new JCheckBox();
        JCheckBox box5 = new JCheckBox();
        JCheckBox box6 = new JCheckBox();
        JCheckBox box7 = new JCheckBox();
        JCheckBox box8 = new JCheckBox();
        JCheckBox box9 = new JCheckBox();
        JCheckBox box10 = new JCheckBox();
        JCheckBox box11 = new JCheckBox();
        JCheckBox box12 = new JCheckBox();
        JCheckBox box13 = new JCheckBox();
        JCheckBox box14 = new JCheckBox();
        JCheckBox box15 = new JCheckBox();
        JCheckBox box16 = new JCheckBox();

        JButton btn1 = new JButton("Check all");
        btn1.addActionListener(new CheckAllAction());

        JButton btn2 = new JButton("Uncheck all");        
        btn2.addActionListener(new UnCheckAllAction());      

        add(box1);
        add(box2);
        add(box3);
        add(box4, "wrap");
        add(box5);
        add(box6);
        add(box7);
        add(box8, "wrap");
        add(box9);
        add(box10);
        add(box11);
        add(box12, "wrap");
        add(box13);
        add(box14);
        add(box15);
        add(box16, "wrap");

        add(btn1, "sgx");
        add(btn2, "sgx");

        pack();

        setTitle("Check boxes");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
    
     private class CheckAllAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {
            
            Component[] components = (Component[]) 
                    getContentPane().getComponents();

            for (Component comp : components) {

                if (comp instanceof JCheckBox) {
                    JCheckBox box = (JCheckBox) comp;
                    box.setSelected(true);
                }
            }            
        }
     }
     
     private class UnCheckAllAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {
            
            Component[] components = (Component[]) 
                    getContentPane().getComponents();

            for (Component comp : components) {

                if (comp instanceof JCheckBox) {
                    JCheckBox box = (JCheckBox) comp;
                    box.setSelected(false);
                }
            }            
        }
     }     

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {
            CheckUncheckEx ex = new CheckUncheckEx();
            ex.setVisible(true);
        });
    }
}

该示例包含十六个复选框和两个按钮。这两个按钮用于选中和取消选中所有复选框。

setLayout(new MigLayout("nogrid"));

使用 MigLayout 管理器来布局组件。MigLayout 是一个第三方布局管理器;因此,我们需要下载并包含该管理器的 JAR。使用 nogrid 约束,我们创建了一个仅流的布局。流方向上的所有组件都将放置在同一个单元格中,因此不会与其他行/列中的组件对齐。

JCheckBox box1 = new JCheckBox();
JCheckBox box2 = new JCheckBox();
JCheckBox box3 = new JCheckBox();
JCheckBox box4 = new JCheckBox();
...

创建了十六个 JCheckBox 组件。

JButton btn1 = new JButton("Check all");
btn1.addActionListener(new CheckAllAction());

创建了一个“全选”按钮,并设置了一个动作监听器。

add(box1);
add(box2);
add(box3);
add(box4, "wrap");

将复选框添加到布局中;它们形成一行。

add(btn1, "sgx");
add(btn2, "sgx");

使用 sgx 约束,使按钮具有相同的大小。

private class CheckAllAction extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent e) {
        
        Component[] components = (Component[]) 
                getContentPane().getComponents();

        for (Component comp : components) {

            if (comp instanceof JCheckBox) {
                JCheckBox box = (JCheckBox) comp;
                box.setSelected(true);
            }
        }            
    }
}

当我们点击“全选”按钮时,会调用 CheckAllActionactionPerformed 方法。在该方法内部,我们使用 getComponents 方法获取内容窗格的所有组件,并使用 instanceof 运算符找出所有的 JCheckBoxsetSelected 方法用于选择 JCheckBox

Check boxes
图:复选框

在本教程中,我们展示了如何在 Swing 应用程序中选择和取消选择所有 JCheckBox 组件。