Aprendiendo con JComboBox… Parte 2

2 08 2008

JComboBox, es un componente swing, y como tal, podemos crear nuestro propio modelo de datos al momento de crear y manipular a este componente(en este caso: jComboBox). Puedes leer MVC en Java para darte la idea general.

En este caso, el ejercicio intenta mostrar la forma sencilla al momento de implementar nuestro propio Modelo de datos para un componente JComboBox.

El ejercicio consiste, en una tipica “barra de direcciones de un navegador”, ingresas la direccion, entras a la pagina, luego el navegador comprueba si existe la direccion,en el caso de no existir, agrega la direccion de la pagina a la barra de direcciones, para un posterior facil acceso.

Bien, para este ejercicio implementaremos 3 clase. la vista(WindowDemoEditaCombo), el control(ControlDemoEditaCombo), y el Modelo del JComboBox (ModeloCombo).

WindowDemoEditaCombo, esta es la clase, que dibuja los componentes swing; En este caso para crear un JComboBox, necesario primero crear nuestro modelo, el cual recibe una cadena de caracteres, los mismos que seran mostrados como items en el combo.

String [] urls = {"www.java.com","inforux.wordpress.com","www.debian.com"};
modeloCombo = new ModeloCombo(urls);
jComboBox1 = new JComboBox(modeloCombo);

Aqui el fuente de la vista(la clase WindowDemoEditaCombo).

import javax.swing.*;
public class WindowDemoEditaCombo extends javax.swing.JFrame {

    public WindowDemoEditaCombo() {/*el constructor de la clase*/
        initComponents();}

    private void initComponents() {
	setResizable(false);
        jPanel1 = new JPanel();
        jLabel2 = new JLabel();
	modeloCombo = new ModeloCombo(urls);//creamos nuestro modelo del Combo
        jComboBox1 = new JComboBox(modeloCombo);//creamos el jComboBox, le enviamos el modelo.
	jComboBox1.setEditable(true);//le decimos q sea editable
	jComboBox1.setSelectedIndex(0);
        jTextField1 = new JTextField();
	jTextField1.setEditable(false);//le decimos q sea NO editable
        jButton1 = new JButton();
        jLabel1 = new JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Aprendiendo con JComboBox2"));
        jPanel1.setLayout(null);

        jLabel2.setText("Direccion Web:");
        jPanel1.add(jLabel2);
        jLabel2.setBounds(10, 40, 110, 20);

        jPanel1.add(jComboBox1);
        jComboBox1.setBounds(110, 40, 230, 24);
        jPanel1.add(jTextField1);
        jTextField1.setBounds(60, 80, 350, 19);

        jButton1.setText("Go");
        jPanel1.add(jButton1);
        jButton1.setBounds(350, 40, 70, 25);

        getContentPane().add(jPanel1);
        jPanel1.setBounds(10, 30, 440, 120);

        jLabel1.setText("DEMO POR INFORUX");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(170, 10, 150, 20);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-471)/2, (screenSize.height-190)/2, 471, 190);

	/*Creamos el objeto controlador de eventos de esta clase*/
	ControlDemoEditaCombo controlDemoEditaCombo = new ControlDemoEditaCombo(this);
	jComboBox1.addActionListener(controlDemoEditaCombo);
	jButton1.addActionListener(controlDemoEditaCombo);
    }

    public static void main(String args[]) {
                new WindowDemoEditaCombo().setVisible(true);}

    // declaramos las variables a usar en la ventana
    public String [] urls = {"Escriba o Selecione","www.java.com","inforux.wordpress.com","www.debian.com"};//creamos el array, q sera enviado a nuestro propio modelo.
    ModeloCombo modeloCombo;//Declaramos nuestro modelo
    public JButton jButton1;
    public JComboBox jComboBox1;
    private JLabel jLabel1;
    private JLabel jLabel2;
    private JPanel jPanel1;
    public JTextField jTextField1;
}

ControlDemoEditaCombo, es la clase controladora de los eventos q generara el usuario con la aplicacion. por tal motivo implementa los metodos de las clases ActionListener..

Aqui el fuente:

import java.awt.event.*;
public class ControlDemoEditaCombo implements ActionListener{
	WindowDemoEditaCombo frame;

	/*el constructor de la clase*/
	public ControlDemoEditaCombo(WindowDemoEditaCombo objeto){
		frame=objeto;//recibe el objeto a controlar
	}

	public void actionPerformed(ActionEvent evento)
    {

	if (evento.getSource()==frame.jButton1 || evento.getSource()==frame.jComboBox1)
	{
		String cadenaSelecionada=frame.modeloCombo.getSelectedItem().toString();
		frame.jTextField1.setText("Direccion Web:  "+cadenaSelecionada);//muestra en l jTextFile lo selecionado
		 if (frame.modeloCombo.buscaItem(cadenaSelecionada)== false)
			frame.modeloCombo.agregaItem(frame.jComboBox1.getSelectedItem().toString());
	}
	}
}

ModeloCombo, es la clase modelo del componente JComboBox. cualquier cambio realizado en dicha clase, se vera reflejado en el componente JComboBox.

Para crear esta clase, hayq tener en cuenta q sera una clase abstracta, es decir, no sabra en q componente se vera reflejado, ademas esta misma debera heredar de la clase “AbstracListModel”.

Porq heredar de AbstracListModel? .- Sencillamente porque accedesmo a los metodos mas generales, y nos permite implementar metodos propios, segun nuestras necesidades.

Tambien debera implementar algunos metodos de la clase ComboBoxModel,

Porq implemenar algunos metodos de la clase ComboBoxModel? .- Porq el componente swing es un JComboBox. y es un componente algo especial, ya q es una combinacion de listas con botones, ademas para acceder a los metodos “getSelectedItem()” y “setSelectedItem()”.

En nuestro caso, aparte de los metodos implementados de la clase ComboBoxModel, hemos codificado algunos metodos adicionales, segun la necesidad del ejercicio.

Aqui el fuente:

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
class ModeloCombo extends AbstractListModel  implements ComboBoxModel{
  boolean loEncontro;
  String [] items = null;//cadena q recibira los datos a mostrar.
  String itemSelecionado=null;
  public ModeloCombo (String [] vector){
		items = vector;
	}

  public Object getElementAt(int index) {
    return items[index];
  }

  public int getSize() {
    return items.length;
  }

  public void setSelectedItem(Object item) {
    itemSelecionado = (String) item;
	fireContentsChanged(this, -1, -1);
  }

 public void agregaItem(String cadena){
	String [] nuevoItems= new String [items.length+1];
		for (int i=0;i<items.length;i++)
			nuevoItems[i]=items[i];
		nuevoItems[items.length]=cadena;
		items=nuevoItems;
		fireContentsChanged(this, -1, -1);
 }

 public boolean buscaItem(String itemABuscar){
	for(int i=0;i<items.length;i++){
		if (itemABuscar==items[i]){
			loEncontro=true;
			break;}
		else {
			loEncontro=false;}
	}
	return loEncontro;
 }

  public Object getSelectedItem() { //metodo implementado por la interface  JComboBoxModel
    return itemSelecionado;
  }

}

Bien, una compilada, y listo.

$javac WindowDemoEditaCombo.java
$java WindowDemoEditaCombo

Listo, aqui algunos pantallazos:

La idea de esta entrada, es mostrar la eficacia q tenemos si es que nos animamos a implementar nuesto propio modelo de datos para los componentes swing.

Espero les sirva a mas de uno.

Un saludos.


Acciones

Information

5 responses

4 08 2008
tuxor

tenia tiempo en buscar un modelo parecido al tuyo, gracias me ha servido.

24 01 2009
Julian

Muchas gracias!! me ha sido de gran ayuda ^^

2 03 2009
fussball

Gute Arbeit hier! Gute Inhalte.

15 08 2010
joel

Buen Foro !!! …. =D !

20 08 2011
jack

donde pongo el primer codigo????!!!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: