Java 在JFrame中计数复选框
所以我在JPanel中有一个带有复选框的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
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)));