package listas; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; /** * Clase para aprender el manejo de JList * * @author Magus */ public class Main extends JFrame implements ActionListener, ListSelectionListener { /** * Para crear una lista dinamica necesito incluir no solo el JList sino * tambien un DefaultListModel, para que sea facil de identificar que * pertenece a este JList lo pongo un poco mas a la derecha. El * DefaultListModel es la clase que se encarga de manejar todos los * elementos que estan en mi lista, asi que si quiero quitar o agregar * elementos lo hago en el DefaultListModel y no en la lista como tal. */ private JList lstEmpleados; private DefaultListModel listModel; private JButton btnFire; private JTextField txtNombre; private JButton btnHire; /** Crea una instancia nueva del programa */ public Main() { setLayout(new BorderLayout()); JPanel pnlAbajo = new JPanel(new GridLayout(1,3)); /** * Inicio el DefaultListModel con el constructor por omision. Despues * utilizo el metodo addElement para ir agregando elementos a la lista, * puedo agregar tantos elementos como quiera. Si te fijas es muy simple * hacer un metodo que permita mandar un arreglo como parametro y copiar * todos sus elmentos al JList utilizando el metodo addElement, si * quieres una inicializacion mas rapida podrias intentar eso. */ listModel = new DefaultListModel(); listModel.addElement("Francisco Laborde"); listModel.addElement("Jose Hernandez"); listModel.addElement("Miguel Mondragon"); listModel.addElement("Alfredo Islas"); listModel.addElement("Gabriela Olin"); listModel.addElement("Diana Barreto"); /** * Para iniciar mi JList utilizo el DefaultListModel al que acabo de * agregarle elementos. */ lstEmpleados = new JList(listModel); /** * El metodo setSelectionMode me permite elegir que tipo de seleccion * quiero, por el momento se recomeidna utilizar SINGLE_SELECTION que es * una variable de la clase ListSelectionModel, otros valores posibles * son SINGLE_INTERVAL_SELECTION y MULTIPLE_INTERVAL_SELECTION */ lstEmpleados.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); /** * Si quiero que al seleccionar la lista se genere algun evento debo * agregarle un ListSelectionListener de la misma manera que * agregariamos un ActionListener */ lstEmpleados.addListSelectionListener(this); /** * Esto sirve para agregar las barras de desplazamiento, lo vamos a ver * mas a detalle en otro trial. */ JScrollPane pane = new JScrollPane(lstEmpleados); getContentPane().add(pane, BorderLayout.CENTER); btnFire = new JButton("Despedir"); btnFire.setEnabled(false); btnFire.addActionListener(this); pnlAbajo.add(btnFire); txtNombre = new JTextField(); pnlAbajo.add(txtNombre); pnlAbajo.add(txtNombre); btnHire = new JButton("Contratar"); btnHire.addActionListener(this); pnlAbajo.add(btnHire); getContentPane().add(pnlAbajo, BorderLayout.SOUTH); setSize(300,300); setTitle("Empleados"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } /** * @param args the command line arguments */ public static void main(String[] args) { Main app = new Main(); } public void valueChanged(ListSelectionEvent e) { /** * No es necesario porque solo tengo una lista pero lo pongo para que * vean que se puede */ if (e.getSource() == lstEmpleados) { /** * Ya que supe que si es la lista la que genero el evento puedo * utilizar el metodo getSelectedIndex() de la lista para saber que * elemento esta seleccionado, si me regresa un -1 quiere decir que * ningun elemento esta seleccionado por lo tanto hago que el boton * para despedir este inutilizable. */ if (lstEmpleados.getSelectedIndex() == -1) btnFire.setEnabled(false); else btnFire.setEnabled(true); } } public void actionPerformed(ActionEvent e) { if (e.getSource() == btnFire) /** * El metodo removeElementAt() de la clase DefaultListModel nos * permite eliminar el elemento que se encuentre en la JList en la * posicion que pasamos como parametro (empezando desde 0). El * metodo getSelectedIndex() (de la JList) nos devuelve el indice * del elemento seleccionado, por lo que podemos utilizarlos en * conjutno para borrar el elemento que este seleccionado * actualmente. En caso de que permita seleccionar muchos valores la * funcion que me regresa un arreglo con los indices seleccionados * es getSelectedIndices() de la JList. Fijenese que como es un * arreglo no puedo utilizarlo directamente en removeElementAt sino * que tendria que utilizar un for. */ listModel.removeElementAt(lstEmpleados.getSelectedIndex()); else if (e.getSource() == btnHire) /** * El metodo addElement del DefaultListModel nos permite agregar mas * elementos a la lista como vimos en la parte superior. */ listModel.addElement(txtNombre.getText()); } }