操作ComboBox项目

时间:2014-12-05 10:26:56

标签: java swing arraylist jcombobox itemlistener

我正在尝试创建一个代码,使用两个包含成绩和单位的组合框来计算学生的GPA。 等级

String [] grade = {"A", "B", "C", "D", "E", "F"};

单元

String[] unit = {"1", "2", "3", "4", "5", "6"};

对于每个课程,将有相应的组合框comboGradecomboUnit组件分别保存数组gradeunit的值。鉴于将有10个课程,comboBox gradeunit将分别为10个。我使用两个ArrayList ArrayList<JComboBox> courseGrade;ArrayList<JComboBox> courseUnit;来管理这个,使用以下代码保存10个组合框:

//grade
    String[] grades = {"A","B","C","D","E","F"};
        courseGrade = new ArrayList<>();
        for (int i=0;i<10;i++){
            JComboBox comboGrade = new JComboBox(grade);
        courseGrade.add(comboUnit); //adds the comboBox to the ArrayList
    }

    //unit
    String[] unit = {"1","2","3","4","5","6"};
        courseUnit = new ArrayList<>();
        for (int i=0;i<10;i++){
            JComboBox comboUnit = new JComboBox(unit);
        courseUnit.add(comboUnit); //adds the comboBox to the ArrayList
    }

我使用此ItemListener

获取了所选项目
public void itemStateChanged(ItemEvent evt){
    String item;
    if (evt.getStateChange()==ItemEvent.SELECTED){
        item = (String) evt.getItem();
每个comboBox

,然后将其添加到新的ArrayList ArrayList<Integer> gradeSelected;

switch (item) {
                        case "A":
                            gradeSelected.add(A);
                            break;
                        case "B":
                            gradeSelected.add(B);
                            break;
                        case "C":
                            gradeSelected.add(C);
                            break;
                        case "D":
                            gradeSelected.add(D);
                            break;
                        case "E":
                            gradeSelected.add(E);
                            break;
                        case "F":
                            gradeSelected.add(F);
                            break;
                    }

其中ABCDEF是表示5,4,3,2的整数常量,分别为1,0

现在这是我的问题......

如果用户DESELECTS SELECTED项目然后从组合框中选择一个新项目怎么办?

//I thought of `ItemEvent.DESLECTED`;

我如何回应此类事件?一旦用户选择了一个项目,就会将其添加到ArrayListgradeSelected”。如何删除已添加的项目并将其替换为完全相同的当前选择

索引作为上一个选择?

或许我正以错误的方式接近这一点。

1 个答案:

答案 0 :(得分:0)

我同意Ironluca,在完成所有选择并准备好提交他的选择之前,不要注册用户的输入,因此我认为最好的解决方案是允许您的GUI可更改并且在用户执行导致输入提交的操作之前,不要对任何输入进行绑定。这可以是按下提交按钮,或者尝试前进到GUI的下一个视图或尝试关闭对话窗口。只要它易于为用户识别,这一步骤无关紧要。此时应验证您的数据,程序应根据输入的数据是否被视为有效和完整而继续下一步。

否则,如果您希望能够在取消选择时从集合中删除项目,则可以始终使用堆栈作为您的集合(例如LinkedList),然后在添加或删除堆栈时在堆栈上推送和弹出项目。 / p>

此外,请考虑将您的成绩信息,字母和数字合并到一个枚举中,而不是切换声明。类似的东西:

public enum Grade {
   A("A", 5), B("B", 4), C("C", 3), D("D", 2), E("E", 1), F("F", 0);

   private String text;
   private int value;

   private Grade(String text, int value) {
      this.text = text;
      this.value = value;
   }

   public String getText() {
      return text;
   }

   public int getValue() {
      return value;
   }

   @Override
   public String toString() {
      return text;
   }
}

然后它可以很容易地使用:

  JComboBox<Grade> gradeCombo = new JComboBox<>(Grade.values());
  gradeCombo.setSelectedIndex(-1);
  JOptionPane.showMessageDialog(null, gradeCombo);

  Grade grade = (Grade) gradeCombo.getSelectedItem();
  if (grade != null) {
     System.out.printf("Grade is %s with a value of %d%n", grade, grade.getValue());
  }