JComboBox не обновляется / обновляется из-за ActionListener
Итак, вот моя проблема: в настоящее время я использую два JComboBox. Предполагается, что второй JComboBox обновляется в зависимости от того, что выбрано в первом JComboBox. В этом случае первый JComboBox содержит инициалы основного исследования: (ART, CSC, MTH, PHY и т. Д.), А второй JComboBox предполагается обновить до всех возможных номеров классов, которые существуют для этого конкретного майора. Таким образом, программа для чтения файлов, которую я имею, может прочитать всю информацию и заполнить оба списка соответственно. Первая проблема, с которой я столкнулся, заключалась во втором обновлении JComboBox, когда из первого JComboBox были выбраны конкретные специальности. Я исправил это, добавив actionListener в первый JComboBox. Но теперь у меня есть другая проблема..
ПРОБЛЕМА: Когда я щелкаю первый JComboBox, появляется список всех основных направлений, которые должны быть, но когда я нажимаю один из основных, он не меняется. Второй JComboBox изменится соответствующим образом, как если бы я выбрал правильный, но первый JComboBox не изменится. Это просто остается на "АРТ" (первый в списке по алфавиту).
Я выбираю один из других вариантов из первого JComboBox: http://imageshack.us/photo/my-images/845/problem2t.jpg/
Он соответствующим образом меняет второй JComboBox, но первый не меняется. http://imageshack.us/photo/my-images/189/problem1n.jpg/
Вот мой код: сначала у меня есть конструктор, который устанавливает графику. Затем у меня есть прослушиватель действий (JComboBox является последним оператором elseif), а затем у меня есть метод, который устанавливает JComboBoxes.
public Student(){
//Window Attributes
setSize(WINDOW_WIDTH,WINDOW_HEIGHT);
setTitle("Academic Major Selection");
//Center the Program Window
Dimension dim = new Dimension(toolkit.getScreenSize());
setLocation((int)dim.getWidth()/2 - WINDOW_WIDTH/2,(int)dim.getHeight()/2 - WINDOW_HEIGHT/2);
//do not allow resizing of window
setResizable(false);
//create arrays for classes
//input file reader here
String[] subjectArray = {"CSC","MTH","ENG","THE","PHY"};
String[] numberArray = {"100","200","300","400","500"};
//create boxes for dropdown
subjectBox = new JComboBox(subjectArray);
subjectBox.addActionListener(this);
numberBox = new JComboBox(numberArray);
//creates a panel for our dropdown panels
selectPanel = new JPanel();
selectPanel.setLayout(new GridLayout(1,2,25,0));
selectPanel.add(subjectBox);
selectPanel.add(numberBox);
.
.
.//trimmed out some excess stuff
.
try {
setDropDownBoxes();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//show the window
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//What button is pressed?
.
.
.//Trimmed out some extra stuff
.
//This will equal true when something is selected from the first JComboBox
}else if(((String)subjectBox.getSelectedItem()).length() == 3){
System.out.println("New Subject Selected");
try {
setDropDownBoxes();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
void setDropDownBoxes() throws IOException{
int j=0;
String[][] someArrayTwoD = studentWriter.fetchClassLists();
String[] subjectArray = new String[someArrayTwoD.length];
while(j<someArrayTwoD.length){
subjectArray[j] = someArrayTwoD[j][0];
j++;
}
String[] numberArray = new String[someArrayTwoD[subjectBox.getSelectedIndex()].length-1];
for(int i=0; i<numberArray.length; i++){
numberArray[i] = someArrayTwoD[subjectBox.getSelectedIndex()][i+1];
}
selectPanel.remove(subjectBox);
selectPanel.remove(numberBox);
subjectBox = new JComboBox(subjectArray);
numberBox = new JComboBox(numberArray);
selectPanel.add(subjectBox);
selectPanel.add(numberBox);
selectPanel.validate();
subjectBox.addActionListener(this);
}
1 ответ
Одна проблема с вашим кодом заключается в том, что вы используете ==
проверить на строковую эквивалентность, а не использовать либо equals(...)
или equalsIgnoreCase(...)
метод:
if(e.getActionCommand() == addButton.getText()){
//....
}
Поймите, что == проверяет, являются ли два объекта одинаковыми, а это не то, что вас интересует. С другой стороны, методы проверяют, имеют ли две строки одинаковые символы в одинаковом порядке, и вот что здесь важно. Так что вместо
if (fu == "bar") {
// do something
}
делать,
if (fu.equals("bar")) {
// do something
}
или же,
if (fu.equalsIgnoreCase("bar")) {
// do something
}
Или, что еще лучше, избавьтесь от своего ActionListener "switch-board", не используйте класс GUI для реализации интерфейсов слушателей (как правило, плохая идея) и вместо этого предоставьте своим JButtons анонимные слушатели внутреннего класса.