我在使用GUI中的复选框时遇到问题。我有一个5个复选框和一个名为“生成报告”的按钮。我想要做的是当我按下“生成报告”时,我想检查选择了哪些复选框,以便我可以使用复选框中选择的信息“生成报告”。我知道如何选中哪个被选中,但是如果选中了一个复选框,然后在点击“生成报告”之前取消选中,我担心程序在选择之后不会知道它是否被取消选择。
这是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class MonthReportGUI implements ItemListener
{
static Calendar calendar = Calendar.getInstance();
JFrame frame = new JFrame("Month Report");
JPanel mainPanel = new JPanel();
JPanel comboPanel = new JPanel();
JLabel info = new JLabel("Use the check boxes to select the information to include in the month report");
JCheckBox checkBoxOne = new JCheckBox("Number accomplished");
JCheckBox checkBoxTwo = new JCheckBox("Number not accomplished");
JCheckBox checkBoxThree = new JCheckBox("Total Number of Jobs");
JCheckBox checkBoxFour = new JCheckBox("Month Salary");
JCheckBox checkBoxFive = new JCheckBox("Average wage per job");
Boolean boxOneSelected = false;
static String [] monthList = {"January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December"};
static String [] createYearList()
{
String [] yearList = new String[89];
String year = (calendar.get(Calendar.YEAR)) + "";
for(int i = 0; i < 88; i++)
yearList[i] = (Integer.parseInt(year) + i) + "";
return(yearList);
}
JLabel monthL = new JLabel("Month:");
JLabel yearL = new JLabel("Year:");
static JComboBox monthCB = new JComboBox(monthList);
static JComboBox yearCB = new JComboBox(createYearList());
JButton generate = new JButton("Generate Report"); // ACTION HAS TO BE ADDED
Boolean oneSelected = false;
Boolean twoSelected = false;
Boolean threeSelected = false;
Boolean fourSelected = false;
Boolean fiveSelected = false;
MonthReportGUI()
{
mainPanel.setLayout(new GridLayout(8,1));
mainPanel.add(info, BorderLayout.CENTER);
mainPanel.add(checkBoxOne, BorderLayout.CENTER);
mainPanel.add(checkBoxTwo, BorderLayout.CENTER);
mainPanel.add(checkBoxThree, BorderLayout.CENTER);
mainPanel.add(checkBoxFour, BorderLayout.CENTER);
mainPanel.add(checkBoxFive, BorderLayout.CENTER);
mainPanel.add(comboPanel);
mainPanel.add(generate, BorderLayout.CENTER);
comboPanel.add(monthL);
comboPanel.add(monthCB);
comboPanel.add(yearL);
comboPanel.add(yearCB);
checkBoxOne.addItemListener(this);
checkBoxTwo.addItemListener(this);
checkBoxThree.addItemListener(this);
checkBoxFour.addItemListener(this);
checkBoxFive.addItemListener(this);
frame.add(mainPanel);
frame.pack();
frame.setVisible(true); //set false
}
public void itemStateChanged(ItemEvent e) //perform action to know which are selected to use for writting report
{
Object source = e.getItemSelectable();
if (source == checkBoxOne)
{
System.out.println(boxOneSelected);
boxOneSelected = true;
System.out.println(boxOneSelected);
}
}
public static void main (String agrs[])
{
MonthReportGUI monthReport = new MonthReportGUI();
}
}
感谢您的时间。
答案 0 :(得分:1)
这是一个非问题,因为您只会在按钮的ActionListener代码中按JButton按下时轮询JCheckBox状态,因此所有这些都将被处理。这是事件驱动编程的关键。代码仅由于事件而发生,因此可以确定事件发生时的程序状态,并生成报告。如果你试图在类构造或其他非事件驱动的方式上获得JCheckBox状态,你只会遇到麻烦。
编辑:根据JB Nizet的帖子,我没有看到你试图将状态存储在变量中。不好。再次,编写ActionListener代码并轮询您的JCheckBoxes。 1 +到JB Nizet。
答案 1 :(得分:1)
将复选框的选择状态存储在单独的布尔字段中没有意义。相反,当单击按钮时,询问复选框是否直接选中:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
generateReport(checkbox1.isSelected(),
checkbox2.isSelected(),
checkbox3.isSelected(),
checkbox4.isSelected(),
checkbox5.isSelected());
}
});
这样做可能会导致正确的结果,但是您正在复制功能,为错误引入新路径,并使其更加复杂。
答案 2 :(得分:1)
更改行:
boxOneSelected = true;
为:
boxOneSelected = checkBoxOne.isSelected();
是否应该在侦听器中进行此检查和分配存在问题,但您确实想要询问复选框是否选择它作为解决方案的核心部分。