как фильтровать содержимое во втором поле со списком в соответствии с выбором первого поля со списком

Я хочу отфильтровать степени, когда пользователь выбирает бакалавриат или аспирантуру. Я поискал в Интернете, но не смог найти четкого ответа с образцом кода.

      private String[] itemsUndergraduate = new String[]{"Computer Science", "Software Engineering"};
    private String[] itemsPostgraduate = new String[]{"BA", "Msc"};
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
   UPselect.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
    String[] itemsUndergraduate = new String[]{"Computer Science", "Software Engineering"};
    String[] itemsPostgraduate = new String[]{"BA", "Msc"};
    String s = (String) UPselect.getSelectedItem();
    if (s.equals("Undergraduate Degrees")){
        //Assign the first list to the combobox
        jComboBox1 = new JComboBox(itemsUndergraduate);
    }
    else{
        //Assign the second list to the combobox
        jComboBox1 = new JComboBox(itemsPostgraduate);
    }
}

});

Это мой код, как я могу это исправить?


person Pasindu Senarath    schedule 29.05.2018    source источник
comment
Просто используйте прослушиватель в верхнем поле со списком, который выполняет сортировку по списку для второго поля ... См. Здесь: stackoverflow.com/questions/58939/ и здесь: stackoverflow.com/questions/17061314/ Задавая вопрос, вы также должны включить некоторый код, показывающий что вы пробовали (прослушиватель действий, ручная сортировка, как вы создаете поле со списком и т. д.).   -  person sorifiend    schedule 29.05.2018
comment
Могу ли я отфильтровать элементы этого списка в соответствии с выбором 1-го комбо?   -  person Pasindu Senarath    schedule 29.05.2018
comment
Да, ты можешь. Используйте addActionListener, чтобы узнать, когда изменяется первое поле, затем удалите все из второго поля и снова добавьте в него все элементы, но в правильном порядке. См. Две ссылки в моем комментарии выше.   -  person sorifiend    schedule 29.05.2018
comment
я делаю не так? можешь это объяснить .. приложу образец кода   -  person Pasindu Senarath    schedule 29.05.2018
comment
Не используйте ==. Вместо этого используйте метод String.equals (), например: if(s.equals("Undergraduate Degrees")) {.   -  person DevilsHnd    schedule 29.05.2018
comment
но все же это не изменится в соответствии с 1-м выпадающим списком ... продолжайте добавлять элементы во 2-е поле ... как это исправить   -  person Pasindu Senarath    schedule 29.05.2018
comment
Очистите JComboBox перед добавлением новых элементов категории: jComboBox1.removeAllItems();.   -  person DevilsHnd    schedule 29.05.2018


Ответы (2)


В ответ на ваши комментарии и обновленный код, да, вы на правильном пути.

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

String[] itemsUndergraduate = new String[]{"Computer Science", "Software Engineering"};
String[] itemsPostgraduate = new String[]{"BA", "Msc"};

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

UPselect.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        String s = (String) UPselect.getSelectedItem();

        //Added this line to help you debug the code
        System.out.print("Does this bit of code ever happen??");
        System.out.print("Value of selected item is: "+s);

        if (s.equals("Undergraduate Degrees")){
            //Assign the first list to the combobox
            jComboBox1 = new JComboBox(itemsUndergraduate);
        }
        else{
            //Assign the second list to the combobox
            jComboBox1 = new JComboBox(itemsPostgraduate);
        }
    }
}
person sorifiend    schedule 29.05.2018
comment
Примечание: как сказал DevilsHnd, убедитесь, что вы используете s.equals( вместо s == - person sorifiend; 29.05.2018
comment
он просит класс jComboBox1? :( - person Pasindu Senarath; 29.05.2018
comment
@PasinduSenarath Я только что скопировал jComboBox1 из вашего кода. Вы увидите эту ошибку, только если jComboBox1 недоступен для вашего метода. Измените существующий код, и он должен работать. - person sorifiend; 29.05.2018
comment
мой плохой .. я не импортировал эту библиотеку. теперь я исправил это. где я должен инициализировать два списка. потому что теперь я не получаю никаких ошибок, но второе поле не обновлялось - person Pasindu Senarath; 29.05.2018
comment
@PasinduSenarath Вы можете хранить их где угодно. Это просто зависит от того, какой уровень доступа вы хотите им предоставить. Может быть, просто сделайте их частными элементами в том же классе, что и слушатель действий. Кроме того, если список не обновляется, уверены ли вы, что jComboBox1 - это правильное поле со списком для обновления? - person sorifiend; 29.05.2018
comment
да, это правильный ящик. все еще не могу понять, в чем проблема этого - person Pasindu Senarath; 29.05.2018
comment
@PasinduSenarath Используйте решение, данное DevilsHnd в комментариях выше. - person sorifiend; 29.05.2018
comment
@PasinduSenarath После вашего последнего редактирования похоже, что ваш слушатель действий не регистрируется правильно. Добавьте эту строку кода в свой метод actionPerformed: System.out.print("Does this bit of code ever happen??");, и вы увидите, что этого никогда не происходит. Вам нужно будет отладить свой код и выяснить, почему. - person sorifiend; 29.05.2018

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

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SwingUtilities;

public class Demo{
    public static void main(String[]args){
        SwingUtilities.invokeLater(()->{
            JFrame frame = new JFrame("Dropdown Demo");
            frame.getContentPane().setLayout(new FlowLayout());
            final String SCIENCE = "Science";
            final String COMMERCE = "Commerce";
            final String SELECT = "Choose";
            frame.getContentPane().add(new JLabel("Stream"));
            JComboBox<String> streams = new JComboBox<>(new String[]{SELECT,SCIENCE,COMMERCE});
            frame.getContentPane().add(streams);
            frame.getContentPane().add(new JLabel("Subjects"));
            DefaultComboBoxModel<String> subjectsModel = new DefaultComboBoxModel<>(new String[]{SELECT});
            JComboBox<String> subjects = new JComboBox<>(subjectsModel);
            frame.getContentPane().add(subjects);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            final String[] SCIENCE_SUBJECTS = {"Maths","Biology","Physics","Chemistry"};
            final String[] COMMERCE_SUBJECTS = {"Economics","Accounts","Taxation"};
            streams.addActionListener((e)->{
                SwingUtilities.invokeLater(()->{
                    subjectsModel.removeAllElements();
                    subjectsModel.addElement(SELECT);
                    String[] temp = {};
                    if(SCIENCE.equals(streams.getSelectedItem())){
                        temp = SCIENCE_SUBJECTS;
                    } else if(COMMERCE.equals(streams.getSelectedItem())){
                        temp = COMMERCE_SUBJECTS;
                    }
                    for(String sub : temp){
                        subjectsModel.addElement(sub);
                    }
                    frame.pack();
                });
            });
        });
    }
}

При запуске:  без выбора

При изменении:  введите описание изображения здесь

person Community    schedule 29.05.2018