JComboBoxes dinámicos

Resuelto Pujan asked hace 14 años • 2 respuestas

Tengo los siguientes datos (Cadena):

Course1: A1
Course1: A2
Course2: B1
Course2: B2
Course2: B3
Course2: B4
Course3: C1
Course3: C2

Me gustaría crear dos JComboBox (JComboBox1, JComboBox2) para que JComboBox1 contenga Curso1, Curso2, Curso3, etc.

Si selecciono, digamos, Curso2 de JComboBox1, entonces los B1,B2,B3,B4 correspondientes deberían completarse en JComboBox2.

¿Cómo implementar esto? Muchas gracias.

Pujan avatar Jul 07 '10 11:07 Pujan
Aceptado

Sí, simplemente cree un DefaultComboBoxModelpara cada conjunto y hágalo setModel()cuando JComboBox2cambie JComboBox1.

Anexo: Por ejemplo,

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComboTest extends JPanel implements ActionListener, Runnable {

    private final JComboBox combo1 = new JComboBox(
        new String[]{"Course 1", "Course 2", "Course 3"});
    private final JComboBox combo2 = new JComboBox();
    private ComboBoxModel[] models = new ComboBoxModel[3];

    public ComboTest() {
        models[0] = new DefaultComboBoxModel(
            new String[]{"A1", "A2"});
        models[1] = new DefaultComboBoxModel(
            new String[]{"B1", "B2", "B3", "B4"});
        models[2] = new DefaultComboBoxModel(
            new String[]{"C1", "C2"});

        combo2.setModel(models[0]);
        this.add(combo1);
        this.add(combo2);
        combo1.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int i = combo1.getSelectedIndex();
        combo2.setModel(models[i]);
    }

    @Override
    public void run() {
        JFrame f = new JFrame("ComboTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new ComboTest());
    }
}
trashgod avatar Jul 07 '2010 04:07 trashgod

Sí. Puede agregar un detector de eventos de cambio al primer JComboBox que actualice los valores del segundo JComboBox.

Algo como esto

// first comboBox
final JComboBox courseBox = new JComboBox(
                               new String[]{"Course 1", "Course 2", "Course 3"});

final JComboBox box2 = new JComboBox();

// Now listen for changes
courseBox.addActionListener(new ActionListener(){
   void actionPerformed(ActionEvent e){
       if(courseBox.getSelectedItem().equals("Course 1")){
           // we know that the user picked "Course 1", now change box2 to match
           // first clear everything
           box2.removeAllItems();
           // now add back relevant values
           box2.addItem("A1");
           box2.addItem("A2");
       }else if(...){
           // ...
       }
   }
});
Mark Elliot avatar Jul 07 '2010 04:07 Mark Elliot