как отфильтровать содержимое во втором поле со списком в соответствии с выбором первого поля со списком - PullRequest
0 голосов
/ 29 мая 2018

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

      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);
    }
}

});

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

Ответы [ 2 ]

0 голосов
/ 29 мая 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();
                });
            });
        });
    }
}

При запуске: without selection

При изменении: enter image description here

0 голосов
/ 29 мая 2018

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

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

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);
        }
    }
}
...