JComboBox Select и Item и на основе выбора отображают новый список

У меня есть следующий код, чтобы на основе выбора пользователя отображался список:

    private class SheepTypeListHandler implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        JComboBox<String> cb = (JComboBox<String>)(e.getSource());
        if (cb.getSelectedItem().equals(sheepType[0])) {
            for (String item : eweClass )
            sheepClassCB.addItem(item);
        }
        else if (cb.getSelectedItem().equals(sheepType[1])) {
            for (String item : ramClass )
                sheepClassCB.addItem(item);
            for (String item : weight3 )
                weightCB.addItem(item);
        }
        else if (cb.getSelectedItem().equals(sheepType[2])) {
            for (String item : lambClass )
                sheepClassCB.addItem(item);
        }
    }
    } //End SheepTypeListHandler class

В настоящее время, в зависимости от того, что вы выбираете, появляется новый список. Однако, если вы передумаете и выберете новый элемент, вместо переопределения того, что есть, он просто добавит новый список в конец первого списка.

Например: Если пользователь выбирает овецТип[2], то появляется следующий список:

Finishing
Early-weaned

Теперь, если они передумают и выберут овцуType[0] вместо этого списка:

Maintenance
Nonlactating, first 15 weeks gestation
Last 6 wks gestation OR Last 8 wks lactation suckling singles
First 8 wks lactation suckling singles OR last 8 wks lactation suckling twins
First 8 weeks lactation suckling twins
Replacement lambs and yearlings

Я получаю это:

Finishing
Early-weaned
Maintenance
Nonlactating, first 15 weeks gestation
Last 6 wks gestation OR Last 8 wks lactation suckling singles
First 8 wks lactation suckling singles OR last 8 wks lactation suckling twins
First 8 weeks lactation suckling twins
Replacement lambs and yearlings

Как изменить текущий код, чтобы он переопределялся при новом выборе, а не просто добавлялся в список? Спасибо!

ОБНОВЛЕНИЕ: часть моего кода изменена на следующее:

private class SheepTypeListHandler implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        sheepClassCB.removeAllItems(); 
        if (sheepListCB.getSelectedItem().equals(sheepType[0])) {
            //sheepClassCB.removeAllItems(); //This did not work
            for (String item : eweClass ){
                sheepClassCB.addItem(item);
            }
        }
        else if (sheepListCB.getSelectedItem().equals(sheepType[1])) {
            for (String item : ramClass )
                sheepClassCB.addItem(item);
            for (String item : weight3 )
                weightCB.addItem(item);
        }
        else if (sheepListCB.getSelectedItem().equals(sheepType[2])) {
            for (String item : lambClass )
                sheepClassCB.addItem(item);
        }
    }
}

Теперь, когда я впервые выбираю элемент из списка, он работает. Но если я повторно выберу другой элемент, он покажет пустой список.


person tinkerton101    schedule 24.04.2015    source источник
comment
Поэтому очистите список, прежде чем добавлять в него данные. Посмотрите API вашего компонента, чтобы узнать, есть ли у него метод для этого. В противном случае посмотрите на API модели вашего компонента, чтобы узнать, что это за метод.   -  person camickr    schedule 24.04.2015
comment
Какой тип sheepClassCB?   -  person user1803551    schedule 25.04.2015
comment
sheepClassCB — это JComboBox, сгенерированный из списка массивов строк: JComboBox<String> sheepListCB = new JComboBox<>(sheepType);   -  person tinkerton101    schedule 25.04.2015
comment
Посмотрите мой ответ и найдите разницу между моим рабочим кодом и вашим.   -  person user1803551    schedule 28.04.2015


Ответы (1)


Кажется, вам не хватает строки sheepClassCB.removeAllItems(). Я сделал простой пример на основе вашего кода:

public class ListEmpty extends JFrame {

    JComboBox<String> changingCB = new JComboBox<>();
    JComboBox<String> unchangingCB = new JComboBox<>();

    String[] numbers = new String[] {"1", "2", "3"};
    String[] letters = new String[] {"a", "b", "c"};
    String[] symbols = new String[] {"!", "@", "#"};

    ListEmpty() {

        unchangingCB.addItem("Numbers");
        unchangingCB.addItem("Letters");
        unchangingCB.addItem("Symbols");
        unchangingCB.addActionListener(new SheepTypeListHandler());

        getContentPane().add(unchangingCB, BorderLayout.LINE_START);
        getContentPane().add(changingCB, BorderLayout.CENTER);

        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private class SheepTypeListHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            changingCB.removeAllItems(); // Compare with removing this line.
            if (unchangingCB.getSelectedItem().equals("Numbers")) {
                for (String item : numbers)
                    changingCB.addItem(item);
            } else if (unchangingCB.getSelectedItem().equals("Letters")) {
                for (String item : letters)
                    changingCB.addItem(item);
            } else if (unchangingCB.getSelectedItem().equals("Symbols")) {
                for (String item : symbols)
                    changingCB.addItem(item);
            }
        }
    }

    public static void main(String[] args) {

        new ListEmpty();
    }
}

Возможно, вы захотите рассмотреть оператор switch вместо нескольких операторов if-else.

person user1803551    schedule 24.04.2015
comment
Приведенный выше ответ работает, но я обнаружил, что в случае нескольких ComboBox, которые работают на основе различных выборов, сделанных в другом ComboBox, вам также необходимо отключить ActionListener перед выполнением действия над одним, а затем снова включить его после завершения действия. В противном случае он все еще работает неправильно. - person tinkerton101; 01.05.2015
comment
@tinkerton101 tinkerton101 Не видя примера кода того, что означает несколько полей со списком, которые работают на основе разных выборов, сделанных в другом поле со списком, я не могу дать правильный ответ. Мой ответ выше на ваш первоначальный вопрос Как мне изменить мой текущий код, чтобы он переопределялся при новом выборе, а не просто добавлялся в список?. - person user1803551; 01.05.2015
comment
проблема решена. Добавление вашего кода устранило первоначальную проблему, а затем добавление моего дополнительного бита работает в случае нескольких ComboBox, которые должны взаимодействовать друг с другом. - person tinkerton101; 01.05.2015
comment
@tinkerton101 Хорошо, но включение и выключение ActionListener обычно означает, что что-то пошло не так в дизайне. Что бы ни работало для вас, хотя. - person user1803551; 01.05.2015