JComboBox dependiente de otro JComboBox

De ChuWiki

Ejemplo de un JComboBox dependiente de otro[editar]

Es bastante habitual en nuestras aplicaciones que las posibles opciones de un JComboBox dependan del valor seleccionado previamente en otro JComboBox.

Vamos a ver aquí un ejemplo tonto de cómo podemos implementar esto.

Primero rellenamos el primer JComboBox, por ejemplo, con dos opciones: "letras" y "números"

combo1 = new JComboBox();
combo1.addItem("letras");
combo1.addItem("numeros");

Ahora tenemos que añadirle algo para enterarnos cuando el usuario selecciona algo y rellenar adecuadamente el segundo JComboBox

// Se añade un listener para enterarnos del cambio de seleccion
combo1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {
      rellenaCombo2((String) combo1.getSelectedItem());
   }

// Se rellenan los valores de combo2 iniciales.
rellenaCombo2 ((String) combo1.getSelectedItem());
});

El método rellenaCombo2() puede tener algo como esto

private void rellenaCombo2(String seleccionEnCombo1) {
   // Se borran los valores previos
   combo2.removeAllItems();

   // Se rellena según la opción en combo1
   if (seleccionEnCombo1.equals("letras")) {
      combo2.addItem("A");
      combo2.addItem("B");
      combo2.addItem("C");
   } else if (seleccionEnCombo1.equals("numeros")) {
      combo2.addItem("1");
      combo2.addItem("2");
      combo2.addItem("3");
}

Es necesario borrar previamente todos los items que tuviera el combo2. Luego se añaden los que correspondan según la opción seleccionada en el combo1.

Por si a alguien le sirve de algo, aquí va un programa tonto completo con todo esto

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class PruebaCombos {

	private JComboBox combo1;

	private JComboBox combo2;

	public static void main(String[] args) {
		new PruebaCombos();
	}

	public PruebaCombos() {
		JFrame v = new JFrame();
		v.getContentPane().setLayout(new FlowLayout());
		combo1 = new JComboBox();
		rellenaCombo1();
		combo1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				rellenaCombo2((String) combo1.getSelectedItem());
			}

		});

		combo2 = new JComboBox();
		rellenaCombo2((String) combo1.getSelectedItem());

		v.getContentPane().add(combo1);
		v.getContentPane().add(combo2);
		v.pack();
		v.setVisible(true);
		v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	private void rellenaCombo1() {
		combo1.addItem("letras");
		combo1.addItem("numeros");
	}

	private void rellenaCombo2(String seleccionEnCombo1) {
		combo2.removeAllItems();
		if (seleccionEnCombo1.equals("letras")) {
			combo2.addItem("A");
			combo2.addItem("B");
			combo2.addItem("C");
		} else if (seleccionEnCombo1.equals("numeros")) {
			combo2.addItem("1");
			combo2.addItem("2");
			combo2.addItem("3");
		}

	}
}