2010-07-07 18 views
9
datos

He siguientes (String):dinámico JComboBoxes

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 contiene course1, course2, Course3, etc.

Si selecciono, por ejemplo, Course2 desde JComboBox1, entonces las B1, B2, B3, B4 correspondientes se deben completar en JComboBox2.

¿Cómo implementar esto? Muchas gracias.

+0

Un ejemplo similar de 'JList' se examina [aquí] (http://stackoverflow.com/q/41514529/230513). – trashgod

Respuesta

21

Sí, basta con crear una DefaultComboBoxModel para cada conjunto, y hacer setModel() en JComboBox2 cuando JComboBox1 cambios.

Adición: 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()); 
    } 
} 
+0

Gracias por responder, esto funciona perfectamente bien. –

+0

@Pujan Srivastava: De nada. – trashgod

+3

O puede usar un mapa. 1+ –

3

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(...){ 
      // ... 
     } 
    } 
}); 
+1

Eso es * realmente * primitivo ... – vemv