java - 关于选中复选框的显示面板

标签 java swing user-interface jcheckbox

我现在正在学习 Java Swing,我从在线教程中获得了这个演示代码。选择相应的复选框后,您可以显示 4 个不同颜色(红色、蓝色、绿色、黄色)的面板。 但是,如果我想从 6("red","blue","green","yellow","black","white") 复选框中选择 4 种颜色,如何根据这个 demo 进行修改?

import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.event.*;

public class CheckBoxExample_UltraExtended implements  ActionListener{

    JCheckBox redCB, blueCB, greenCB, yellowCB;
    JPanel redBox, blueBox, greenBox, yellowBox;
    JButton refresh;

    public JPanel createContentPane (){

        JPanel totalGUI = new JPanel();

        // We create four checkboxes to control what is currently on-screen.
        // At the start, we set the red checkbox to 'ticked' or selected.

        JPanel checkBoxPanel = new JPanel();
        checkBoxPanel.setLayout(new BoxLayout(checkBoxPanel, BoxLayout.PAGE_AXIS));
        checkBoxPanel.add(Box.createRigidArea(new Dimension(10,0)));

        redCB = new JCheckBox("Red");
        redCB.setSelected(true);

        checkBoxPanel.add(redCB);
        checkBoxPanel.add(Box.createHorizontalGlue());

        blueCB = new JCheckBox("Blue");        
        checkBoxPanel.add(blueCB);
        checkBoxPanel.add(Box.createHorizontalGlue());

        greenCB = new JCheckBox("Green");
        checkBoxPanel.add(greenCB);
        checkBoxPanel.add(Box.createHorizontalGlue());

        yellowCB = new JCheckBox("Yellow");
        checkBoxPanel.add(yellowCB);
        checkBoxPanel.add(Box.createRigidArea(new Dimension(10, 0)));

        // Now we create a simple JPanel that displays our four coloured boxes.

        JPanel boxPanel = new JPanel(new GridLayout(2, 2, 20, 20));

        redBox = createSquareJPanel(Color.red, 50);
        blueBox = createSquareJPanel(Color.blue, 50);
        greenBox = createSquareJPanel(Color.green, 50);
        yellowBox = createSquareJPanel(Color.yellow, 50);

        // This sets all bar the red box to be hidden.

        blueBox.setVisible(false);
        greenBox.setVisible(false);
        yellowBox.setVisible(false);

        boxPanel.add(redBox);
        boxPanel.add(blueBox);
        boxPanel.add(greenBox);
        boxPanel.add(yellowBox);

        // Now lets quickly add a refresh button with an actionListener to determine
        // when it is pressed.

        refresh = new JButton("Refresh");
        refresh.addActionListener(this);

        totalGUI.add(checkBoxPanel);
        totalGUI.add(boxPanel);
        totalGUI.add(refresh);

        totalGUI.setOpaque(true);
        return totalGUI;
    }

    // In this method, we create a square JPanel of a colour and set size
    // specified by the arguments.

    private JPanel createSquareJPanel(Color color, int size) {
        JPanel tempPanel = new JPanel();
        tempPanel.setBackground(color);
        tempPanel.setMinimumSize(new Dimension(size, size));
        tempPanel.setMaximumSize(new Dimension(size, size));
        tempPanel.setPreferredSize(new Dimension(size, size));
        return tempPanel;
    }

    // This actionPerformed simply takes sets the visibility of each
    // coloured box to the state of each checkbox.

    public void actionPerformed(ActionEvent e) {

        if(e.getSource() == refresh)
        {
            redBox.setVisible(redCB.isSelected());
            blueBox.setVisible(blueCB.isSelected());
            greenBox.setVisible(greenCB.isSelected());
            yellowBox.setVisible(yellowCB.isSelected());
        }
    }


    private static void createAndShowGUI() {

        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("[=] JCheckBox [=]");

        CheckBoxExample_UltraExtended demo = new CheckBoxExample_UltraExtended();
        frame.setContentPane(demo.createContentPane());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

最佳答案

你必须像这样addActionListener到复选框。

采用private 变量numberOfCheckedBoxes 来跟踪选中复选框的数量。

private numberOfCheckedBoxes = 0;

现在,当您创建复选框时,像这样添加 Action 监听器

redCB = new JCheckBox("Red");
redCB.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        if (numberOfCheckedBoxes  == 4){
            JOptionMessage.showMessageDialog("Can not select more than 4 check boxes");
            return;
        }
        if (redCB.isSelected()){
            increaseNumberOfCheckedBoxes();
        }else{
            reduceNumberOfCheckedBoxes();
        }
    }
});

您必须为您创建的所有复选框执行此操作。现在是其他所需的方法。

public void increaseNumberOfCheckedBoxes(){
    numberOfCheckedBoxes ++;
}
public void reduceNumberOfCheckedBoxes(){
    numberOfCheckedBoxes --;
}

另一种方法是,创建一个方法handleCheckBoxSelection

public handleCheckBoxSelection(boolean isSelected){
    if (numberOfCheckedBoxes  == 4){
        JOptionMessage.showMessageDialog("Can not select more than 4 check boxes");
        return;
    }
    if (isSelected){
        increaseNumberOfCheckedBoxes();
    }else{
        reduceNumberOfCheckedBoxes();
    }
}

然后在初始化复选框时,调用这个函数

redCB = new JCheckBox("Red");
redCB.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        handleCheckBoxSelection(redCB.isSelected());
    }
});

关于java - 关于选中复选框的显示面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15653900/

相关文章:

java - 添加 JTextField 时不显示任何内容

java - 更改 jframe 中图标的大小和形状

java - 简单的图像旋转

java - 使用 Java 进行 XML 解析(JAXB 和根元素)

java - 有哪些工具可以绘制项目架构?

Java 框架在 while 循环期间无法正确显示

带有自定义 JSON 对象的 jQuery UI 自动完成

java - 使用 Apache POI 时出现空指针异常

java - Eclipse - 找不到源

java - 为什么这个基本的 JavaFX 程序无法启动?