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 анонимные слушатели внутреннего класса.

Другие вопросы по тегам