1

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();
  }
}

お時間をいただきありがとうございます。

4

3 に答える 3

1

これは問題ではありません。ボタンのActionListenerコードでのみJButtonを押したときにJCheckBoxの状態をポーリングするため、これらすべてが処理されます。これがイベント駆動型プログラミングの鍵です。コードはイベントが原因でのみ発生するため、イベント時のプログラムの状態を確認して、レポートを生成できます。クラス構築またはその他のイベント駆動型ではない方法でJCheckBoxの状態を取得しようとした場合にのみ、問題が発生します。

編集:JB Nizetの投稿によると、状態を変数に格納しようとしていることはわかりませんでした。良くない。ここでも、ActionListenerコードを記述し、JCheckBoxをポーリングします。1+からJBNizetへ。

于 2012-12-02T18:27:57.373 に答える
1

チェックボックスの選択状態を別のブールフィールドに保存しても意味がありません。代わりに、ボタンがクリックされたときに、ボタンが直接選択されているかどうかをチェックボックスに確認します。

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        generateReport(checkbox1.isSelected(),
                       checkbox2.isSelected(),
                       checkbox3.isSelected(),
                       checkbox4.isSelected(),
                       checkbox5.isSelected());
    }
});

自分がしているようにそれを行うと、正しい結果が得られる可能性がありますが、機能を複製し、バグの新しいパスを導入し、本来よりも複雑にします。

于 2012-12-02T18:29:18.597 に答える
1

行を変更します。

boxOneSelected = true;

に:

boxOneSelected = checkBoxOne.isSelected();

このチェックと割り当てをリスナーで行う必要があるかどうかについての問題がありますが、ソリューションのコア部分として選択されているかどうかをチェックボックスで確認する必要があります。

于 2012-12-02T18:30:46.927 に答える