Java 在JFrame中计数复选框

Java 在JFrame中计数复选框,java,swing,Java,Swing,所以我在JPanel中有一个带有复选框的JFrame。我想计算选中复选框的数量,然后将该数量乘以一个数字,然后在屏幕上打印。有什么建议吗?我想使用一个数组来存储复选框,然后在数组中搜索并查看哪些复选框被选中。然后数一数复选框的数量,这样它就可以用于我需要做的任何事情。如何修复我的代码 import java.awt.BorderLayout; import java.awt.Checkbox; import java.awt.Component; import java.awt.Containe

所以我在JPanel中有一个带有复选框的JFrame。我想计算选中复选框的数量,然后将该数量乘以一个数字,然后在屏幕上打印。有什么建议吗?我想使用一个数组来存储复选框,然后在数组中搜索并查看哪些复选框被选中。然后数一数复选框的数量,这样它就可以用于我需要做的任何事情。如何修复我的代码

import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;


public class FYFGUI extends JFrame implements ActionListener
{
    Container cont = getContentPane();
    private GridLayout layout = new GridLayout(6,2);
    JPanel panel = new JPanel(layout);
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JCheckBox s1 = new JCheckBox("Mowing",false);
    JCheckBox s2 = new JCheckBox("Edging",false);
    JCheckBox s3 = new JCheckBox("Trimming",false);
    JCheckBox s4 = new JCheckBox("Blowing",false);
    JCheckBox s5 = new JCheckBox("Mulch",false);
    JCheckBox s6 = new JCheckBox("Hedges",false);
    JCheckBox s7 = new JCheckBox("Pruning Trees", false);
    JCheckBox s8 = new JCheckBox("Landscaping",false);
    JCheckBox s9 = new JCheckBox("Weeding", false);
    JCheckBox s10 = new JCheckBox("Leaf Removal", false);
    JLabel lbl = new JLabel("What services would you like?");
    JLabel Sqft = new JLabel("How many Sq. feet?");
    JTextField area = new JTextField(4);
    JButton exit =  new JButton("Exit");
    JButton calculate = new JButton("Calculate");

    public FYFGUI()
    {
        super("FrontYard Fairways");
        cont.setLayout(new BorderLayout());
        cont.add(panel, BorderLayout.WEST);
        cont.add(panel2, BorderLayout.SOUTH);
        cont.add(panel3, BorderLayout.EAST);
        panel.add(lbl);
        panel.add(s1);
        panel.add(s2);
        panel.add(s3);
        panel.add(s4);
        panel.add(s5);
        panel.add(s6);
        panel.add(s7);
        panel.add(s8);
        panel.add(s9);
        panel.add(s10);
        panel2.add(exit);
        panel2.add(calculate);
        panel3.add(Sqft);
        panel3.add(area);
        calculate.addActionListener(this);
        exit.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        // TODO Auto-generated method stub
        Object source = e.getSource();
        if(source == exit)
        {
            System.exit(0);
        }
//This is where the question comes........
        // Get the number of check boxes selected and calculate prices. //SO,here is basically what I want to do....though this is wrong how do I fix this?
JCheckBox[] boxes = {s1,s2,s3,s4,s5,s6,s7,s8,s9,s10};
        int count;
        for(int i = 0; i < boxes.length; ++i){
            if(boxes[i].isSelected()){
                ++count;
            }

        // Get the sq ft and calculate prices
        // Use the above to calculate hours required
        // Return the total price of service + sqft + hours

    }
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
         FYFGUI frame = new FYFGUI();
         frame.setVisible(true);
         frame.setDefaultCloseOperation(FYFGUI.EXIT_ON_CLOSE);
         frame.setSize(800,500);
         frame.setResizable(false);

    }


}
导入java.awt.BorderLayout;
导入java.awt.Checkbox;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入javax.swing.*;
公共类FYFGUI扩展JFrame实现ActionListener
{
Container=getContentPane();
私有网格布局=新网格布局(6,2);
JPanel面板=新JPanel(布局);
JPanel panel2=新的JPanel();
JPanel panel3=新的JPanel();
JCheckBox s1=新的JCheckBox(“割草”,错误);
JCheckBox s2=新JCheckBox(“边缘”,假);
JCheckBox s3=新的JCheckBox(“修剪”,假);
JCheckBox s4=新的JCheckBox(“吹气”,假);
JCheckBox s5=新JCheckBox(“覆盖物”,假);
JCheckBox s6=新JCheckBox(“对冲”,假);
JCheckBox s7=新的JCheckBox(“修剪树”,错误);
JCheckBox s8=新的JCheckBox(“美化”,假);
JCheckBox s9=新的JCheckBox(“除草”,假);
JCheckBox s10=新的JCheckBox(“叶子去除”,假);
JLabel lbl=新的JLabel(“您想要什么服务?”);
JLabel Sqft=新JLabel(“多少平方英尺?”);
JTextField区域=新的JTextField(4);
JButton exit=新JButton(“exit”);
JButton calculate=新JButton(“计算”);
公共FYFGUI()
{
超级(“前院球道”);
cont.setLayout(新的BorderLayout());
继续添加(面板,边界布局。西部);
续(面板2,南部边界布局);
续(面板3,东边界布局);
面板。添加(lbl);
增补(s1);
面板。添加(s2);
增补(s3);
小组委员会.增补(s4);
面板。添加(s5);
小组委员会.增补(中六);
小组委员会.增补(s7);
小组委员会.增补(s8);
添加面板(s9);
面板。添加(s10);
面板2.添加(退出);
2.增加(计算);
面板3.添加(Sqft);
3.增加(面积);
calculate.addActionListener(这个);
exit.addActionListener(this);
}
@凌驾
已执行的公共无效操作(操作事件e)
{
//TODO自动生成的方法存根
对象源=e.getSource();
如果(源==退出)
{
系统出口(0);
}
//这就是问题所在。。。。。。。。
//获取所选复选框的数量并计算价格//因此,以下是我基本上想要做的……虽然这是错误的,但我如何解决这个问题?
JCheckBox[]框={s1、s2、s3、s4、s5、s6、s7、s8、s9、s10};
整数计数;
对于(int i=0;i
如果您用所有复选框组成一个数组,您可以简单地在其中循环并计算激活的复选框的数量。代码可能看起来像这样,但为了简单起见,使用了一个复选框数组:

package jcheckboxtester;
/**
 * @author Miharu461
 */
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class JCheckBoxTester extends JFrame {
    public JCheckBoxTester() {
        setLayout(null);
        setLocationRelativeTo(null);
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JCheckBox box = new JCheckBox();
        JLabel label = new JLabel("Number Selected: 0");
        label.setBounds(0, 40, 200, 25);

        box.setBounds(0, 0, 25, 25);
        getContentPane().add(box);
        box.addActionListener((ActionEvent e) -> {
            int count = 0;
            if(box.isSelected()) 
                count++;

            label.setText("Number Selected: " + count);
        });

        getContentPane().add(label);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new JCheckBoxTester().setVisible(true);
        });
    }
}

将ActionListener添加到每个JCheckBox(您可以使用ActionListener的同一个实例)。每次触发侦听器时,检查选择了哪个JChechBox(比较
ActionEvent
源代码或
actionCommand

根据所选的
JCheckBox
(已执行)状态,从总数中添加或减去所需金额

通过这种方式,您可以实时进行计数。如果您很聪明,现在有一些方法可以自动完成此操作,因此您所要做的就是为自定义
操作
之类的内容提供一些文本和值(可能还有一个模型),它可以为您提供一辆汽车

见和

现在,就我个人而言,我更喜欢使用
Action
API,它们是自包含的工作单元,可以自我配置

public class JobAction extends AbstractAction {

    private JobModel model;
    private double amount;

    public JobAction(JobModel model, String text, double amount) {
        this.model = model;
        this.amount = amount;
        putValue(NAME, text);
        putValue(SELECTED_KEY, false);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object value = getValue(SELECTED_KEY);
        if (value instanceof Boolean) {
            boolean selected = (boolean) value;
            if (selected) {
                model.addJob(getValue(NAME).toString(), amount);
            } else {
                model.removeJob(getValue(NAME).toString(), amount);
            }
        }
    }

}
在本例中,
JobModel
仅描述可能发生的操作,在本例中,添加和删除作业

public interface JobModel {
    public void addJob(String text, double amount);
    public void removeJob(String text, double amount);
}
(这让我很想制作一个
作业
界面,其中包含文本和金额,但这就是我)

我更喜欢在可能的地方使用接口,它使代码更加灵活,并限制代码的其他区域,因此它们只能执行某些操作,但这就是我

然后,您就可以使用类似于

JobModel model = new DefaultJobModel(); // You'll need to create this
panel.add(new JCheckBox(new JobAction(model, "Mowing", 10d)));

您还需要考虑在模型中提供某种类型的观察者模式(侦听器),它可以在模型改变时触发通知。


通过阅读java文档查看更多详细信息。

是的。您需要做的就是从框架中解析组件层次结构并处理单个组件。我不明白。有没有示例?1.)我想您的意思是
复选框
JCombobox
无法选择。2.)阅读以下内容:。基本上框架形式中的所有组件树(框架是根)。遍历此树并检查组件是否为复选框。虽然使用侦听器会更容易,但如何计算所选复选框的数量?让我们假设像ActionListeners这样需要的所有内容都存在。我需要一个函数来计算c的数量
JobModel model = new DefaultJobModel(); // You'll need to create this
panel.add(new JCheckBox(new JobAction(model, "Mowing", 10d)));