由于ActionListener,JComboBox不刷新/更新

时间:2013-04-23 01:07:20

标签: java swing actionlistener jcombobox

所以这是我的问题:我目前正在使用两个JComboBox。第二个JComboBox假定根据第一个JComboBox中选择的内容进行更新。在这种情况下,第一个JComboBox包含一个主要研究的首字母:(ART,CSC,MTH,PHY等),第二个JComboBox假设更新为该特定主要的所有可能的类号。所以我拥有的文件阅读器能够读取所有信息并相应地填写两个列表。我遇到的第一个问题是在从第一个JComboBox中选择特定专业时进行第二次JComboBox更新。我通过向第一个JComboBox添加一个actionListener来解决这个问题。但现在我有另一个问题..:

问题:当我点击第一个JComboBox时,会有一个列表显示应该有的所有专业,但是当我点击其中一个专业时,它不会改变。第二个JComboBox将正确更改,就像我选择了正确的一个,但第一个JComboBox不会改变。它只是停留在“ART”(按字母顺序排在列表中的第一位)。

我从第一个JComboBox中选择其中一个选项: http://imageshack.us/photo/my-images/845/problem2t.jpg/

它会适当地更改第二个JComboBox,但第一个不会改变。 http://imageshack.us/photo/my-images/189/problem1n.jpg/

这是我的代码:首先我有我的构造函数来设置图形。然后我有我的动作监听器(JComboBox是最后一个elseif语句),然后我有我的方法来设置JComboBox。

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 个答案:

答案 0 :(得分:2)

您的代码存在的一个问题是,您使用==来检查字符串等效性,而不是使用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,没有你的GUI类实现监听器接口(通常是一个坏主意),而是给你的JButtons匿名内部类监听器。