/ / Manipulowanie elementami ComboBox - java, swing, arraylist, jcombobox, itemlistener

Manipulowanie elementami ComboBox - java, swing, arraylist, jcombobox, itemlistener

Próbuję utworzyć kod, który oblicza GPA studenta przy użyciu dwóch pól comboBox, które przechowują oceny i jednostki. stopień

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

jednostka

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

Dla każdego kursu będzie odpowiedni comboBox comboGrade i comboUnit komponenty przechowujące wartości tablicy grade i unit odpowiednio. Biorąc pod uwagę, że będzie 10 kursów, comboBox grade i unit będzie 10. Udało mi się to za pomocą dwóch ArrayList ArrayList<JComboBox> courseGrade; i ArrayList<JComboBox> courseUnit; do przechowywania 10 pól kombi przy użyciu następującego kodu:

//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
}

Korzystam z tego wybranego elementu ItemListener:

public void itemStateChanged(ItemEvent evt){
String item;
if (evt.getStateChange()==ItemEvent.SELECTED){
item = (String) evt.getItem();

dla każdego z comboBox a następnie dodał go do nowego 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;
}

gdzie A, B, C, D, E, F są stałymi całkowitymi reprezentującymi odpowiednio 5,4,3,2,1,0

Oto mój problem ...

Co jeśli użytkownik WYBIERZ WYBRANY element, a następnie wybierze nowy element z pola kombi?

//I thought of `ItemEvent.DESLECTED`;

Jak odpowiedzieć na takie zdarzenie? biorąc pod uwagę, że gdy użytkownik już wybrał element, został on dodany do ArrayList "gradeSelected". Jak mogę usunąć już dodany element i zastąpić go bieżącym zaznaczeniem w dokładnie taki sam sposób

indeksować jako poprzedni wybór?

Być może podchodzę do tego w niewłaściwy sposób.

Odpowiedzi:

0 dla odpowiedzi № 1

Zgadzam się z Ironluca, nie rejestruj użytkownikadanych wejściowych, dopóki nie dokończy dokonywania wszystkich wyborów i nie będzie gotowy do przesłania swoich wyborów, dlatego uważam, że najlepszym rozwiązaniem jest umożliwienie zmiany GUI i brak wiązania danych wejściowych, dopóki użytkownik nie wykona akcji powoduje przesłanie danych wejściowych. Może to nastąpić po naciśnięciu przycisku przesyłania lub podczas próby przejścia do następnego widoku GUI lub próby zamknięcia okna dialogowego. Nie ma znaczenia, czym jest ten krok, o ile jest łatwo rozpoznawalny dla użytkownika. W tym momencie dane powinny zostać zweryfikowane, a program powinien przejść do następnego kroku na podstawie tego, czy wprowadzone dane zostały uznane za być poprawnym i kompletnym czy nie.

W przeciwnym razie, jeśli chcesz mieć możliwość usunięciaelementów z kolekcji po odznaczeniu, zawsze możesz użyć stosu do swojej kolekcji, takiego jak LinkedList, a następnie wypychać i pop elementy na stosie, gdy są dodawane lub usuwane.

Ponadto zamiast instrukcji zamiany rozważ konsolidację informacji o ocenach, litery i liczby w wyliczeniu. Coś jak:

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

Następnie można go łatwo użyć:

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