106879922 Tabla Con JComboBox en Columna

17
Tabla con JComboBox en columna Veremos como podemos incluir en una columna el uso de un JComboBox, esto nos sirve para escoger entre datos que no varían, como el sexo (Masculino o Femenino), año, etc. El programa nos permite copiar el nombre, el apellido y el sexo lo debemos escoger del JComboBox, ademas podemos agregar filas vacias, en este caso el sexo por defecto es Masculino. Imágenes Código Clase Principal

Transcript of 106879922 Tabla Con JComboBox en Columna

Page 1: 106879922 Tabla Con JComboBox en Columna

Tabla con JComboBox en columna

Veremos como podemos incluir en una columna el uso de un JComboBox, esto nos sirve para escoger entre datos que no varían, como el sexo (Masculino o Femenino), año, etc.

El programa nos permite copiar el nombre, el apellido y el sexo lo debemos escoger del JComboBox, ademas podemos agregar filas vacias, en este caso el sexo por defecto es Masculino.

Imágenes

Código

Clase Principal

package Clases;

Page 2: 106879922 Tabla Con JComboBox en Columna

import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;

public class Principal extends JApplet { JTable tabla; JComboBox sexo; DefaultTableModel modelo; public void init(){ String nomcols[]={"Nombre","Apellido","Sexo"}; String datos[][]=new String[4][3]; datos[0][0]="Java"; datos[0][1]="Zone"; datos[0][2]="Masculino"; modelo=new DefaultTableModel(datos,nomcols); tabla=new JTable(modelo); TableColumn col=tabla.getColumnModel().getColumn(2); String op[]={"Masculino","Femenino"}; sexo=new JComboBox(op); col.setCellEditor(new DefaultCellEditor(sexo)); JScrollPane scroll=new JScrollPane(tabla); add(scroll); JPanel pbotones=new JPanel(); JButton agregar=new JButton("Agregar"); agregar.addActionListener(new ActionListener(){

@Override public void actionPerformed(ActionEvent arg0) { String s[]={"","","Masculino"}; modelo.addRow(s); } });

Page 3: 106879922 Tabla Con JComboBox en Columna

pbotones.add(agregar); add(pbotones,BorderLayout.SOUTH); }}

Como vemos el código no es complicado, lo que hacemos es crear una tabla, creamos un JComboBox, luego le indicamos que la tercera columna va a ser representada con un JComboBox, esto lo hacemos con el método setCellEditor(new DefaultCellEditor(sexo)); de la clase TableColumn, tenemos que obtener el TableColumn de la columna que nos interesa colocar el JComboBox, esto lo hacemos con tabla.getColumnModel().getColumn(2); con este método indicamos que queremos el TableColumn de la columna 3, se indica con un 2 ya que las columnas se enumeran de 0 a n-1, 3 en este caso

Using a Combo Box as an Editor

Setting up a combo box as an editor is simple, as the following example shows. The bold line of code sets up the combo box as the editor for a specific column.

TableColumn sportColumn = table.getColumnModel().getColumn(2);...JComboBox comboBox = new JComboBox();comboBox.addItem("Snowboarding");comboBox.addItem("Rowing");comboBox.addItem("Chasing toddlers");comboBox.addItem("Speed reading");comboBox.addItem("Teaching high school");comboBox.addItem("None");sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

Here is a picture of the combo box editor in use:

The preceding code is from TableRenderDemo.java. You can run TableRenderDemo (click the Launch button) using Java™ Web Start (download JDK 6 or later). Or, to compile and run the example yourself, consult the example index.

Page 4: 106879922 Tabla Con JComboBox en Columna

que tengo que hacer 2 veces click sobre el mismo para que lo seleccione, y una vez que lo hace, la tabla queda colgada. No funcionan ni el Tabulador para pasar de columna ni el doble click para editar una celda.

Adjunto el código para ver si alguno detecta el problema:Code: [Select]import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.*;import javax.swing.event.*;import java.sql.*;

/** * Panel con toda la parte visual del ejemplo. Crea un JScrollPane con el JTable * en su interior y dos JButton para añadir y borrar elementos de la tabla. */public class PanelCompleto extends JPanel implements TableModelListener {     /**      * Constructor que recibe el modelo de la tabla y el control. Guarda ambos      * y llama al metodo construyeVentana() que se encarga de crear los      * componentes.      */     public PanelCompleto(ModeloTabla modelo, ControlTabla control)     {         super (new GridBagLayout());         this.modelo = modelo;         this.control = control;         conexion = new ConectarMotor();         construyeVentana();     }

     /**      * Crea los componentes de este panel.      * Un JScrollPane, el JTable que va dentro y dos JButton para añadir y      * quitar elementos del JTable.      */     private void construyeVentana()     {         // Para poner las restricciones a los componentes (posicioes dentro         // del panel)         GridBagConstraints restricciones = new GridBagConstraints();

         // Un JScrollPane con el JTable dentro.         // Las restricciones...         restricciones.gridx = 0;         restricciones.gridy = 0;         restricciones.gridwidth = GridBagConstraints.REMAINDER;         restricciones.fill = GridBagConstraints.BOTH;         restricciones.weightx = 1.0;         restricciones.weighty = 1.0;

Page 5: 106879922 Tabla Con JComboBox en Columna

         // Se crea el JScrollPane, el JTable y se pone la cabecera...         JScrollPane scroll = new JScrollPane();         JTable tabla = new JTable (modelo);         scroll.setViewportView(tabla);         scroll.setColumnHeaderView (tabla.getTableHeader());

//Se agrega un oyente para detectar los cambios en la tabla. Luego con el método tableChanged administramos los cambios

oyenteModelo = tabla.getModel(); oyenteModelo.addTableModelListener(this);

//Se establece como ComboBox el editor por defecto de la primera columna (IdConcepto), y lo llenamos con los datos de la tabla conceptos

try{ conexion.cargarDriver(); conexion.crearConexion("host", "base",

"instancia", "usuario", "password"); resultado = conexion.ejecutarQuery("SELECT

IdConcepto,Descripcion FROM Conceptos WHERE IdTipo_Srv = 5"); } catch(Exception excepcion){

excepcion.printStackTrace(); }

TableColumn concepto = tabla.getColumnModel().getColumn(0);

final JComboBox comboBox = new JComboBox();

try{ resultado.first(); while(resultado.next()){

comboBox.addItem(resultado.getObject(1));}

} catch(SQLException excepcion){ excepcion.printStackTrace(); }

concepto.setCellEditor(new DefaultCellEditor(comboBox));

comboBox.setEnabled(true); comboBox.setEditable(false); comboBox.setSelectedIndex(7); comboBox.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evento)

{ comboBox.getSelectedIndex();

} }); //Fin del agregado del ComboBox

         // ... y se añade todo al panel         this.add(scroll, restricciones);

         // Un botón para añadir nuevas filas.         // Su posición en el panel ...         restricciones.gridy = 1;         restricciones.gridwidth = 1;

Page 6: 106879922 Tabla Con JComboBox en Columna

         restricciones.weighty = 0.0;         restricciones.fill = GridBagConstraints.NONE;         restricciones.anchor = GridBagConstraints.WEST;

         // Se crea el botón         JButton botonAnhadir = new JButton ("Añadir");

         // Se añade al panel         this.add (botonAnhadir, restricciones);

         // y se le pone la acción a ejecutar cuando se pulse.         botonAnhadir.addActionListener(new ActionListener() {             public void actionPerformed (ActionEvent evento)             {                 control.agregaFila();             }         });

         // Un botón para borrar filas.         // La posición en el panel...         restricciones.gridx = 3;         restricciones.weightx = 0.0;         restricciones.anchor = GridBagConstraints.EAST;

         // se crea el botón         JButton botonBorrar = new JButton ("Borrar");

         // se añade al panel         this.add (botonBorrar, restricciones);

         // y se le añade la acción a ajecutar.         botonBorrar.addActionListener(new ActionListener() {             public void actionPerformed (ActionEvent evento)             {                 control.borraFila();             }         });     }

     public void tableChanged(TableModelEvent e) {

int row = e.getFirstRow(); int column = e.getColumn(); String columnName = oyenteModelo.getColumnName(column); Object data = oyenteModelo.getValueAt(row, column); //System.out.println("Cambio la tabla" +

data.toString());

}

     /** Modelo de la tabla */     private ModeloTabla modelo = null;

     /** Para modificar el modelo */     private ControlTabla control = null;

     private TableModel oyenteModelo;

     /** Clase para conectar al motor */     private ConectarMotor conexion;

Page 7: 106879922 Tabla Con JComboBox en Columna

     /** Variable para almacenar el ResultSet */     private ResultSet resultado;}

Como incrustar un JDateChooser o un JButton en un JTable

El problema:

Se quiere presentar una tabla (un JTable) que detro tenga un JButton y al lado de el un JDateChooser.

Pasos pra resolver el problema:

1. Crear una implementación de la interfaz TableCellRenderer para mostrar algunas celdas como botones o como Calendarios.

2. Crear una implementación de la interfaz TableCellEditor para que la celda funcione como boton o como calendario.

3. Crear un modelo que extienda de DefaultTableModel para mostrar los datos de la tabla

La forma de implementar:

Primero implementamos el modelo:

package prueba;// si no tienes el jar de este componenete quita el importimport com.toedter.calendar.JDateChooser;import javax.swing.JButton;import javax.swing.table.DefaultTableModel;

/**** @author gatsu*/public class MiModelo extends DefaultTableModel{

/** * Este metodo indica que clase esta en que celda. Es importantisimo. */ @Override public Class getColumnClass(int columnIndex) { if( columnIndex == 0) { return JButton.class; } else

Page 8: 106879922 Tabla Con JComboBox en Columna

{ // si no tienes el jar del JDateChooser solo regresa el JButton.class return JDateChooser.class; } }

@Override public int getColumnCount() { // la tabla solo tiene 2 columnas return 2; }

@Override public int getRowCount() { // la tabla solo tiene una fila return 1; }

@Override public Object getValueAt(int row, int column) { if( column == 0 ) { // en la primera columna el elemento es un boton return new JButton("hola"); } // en la otra columna el elemento es un calendario (si no esta el jar solo hay que poner el return del boton sin ningun if). return new JDateChooser(); }

}

Ahora para el render basta con decir que pinte el componente que tiene el modelo.

/** @author gatsu*/package mx.gob.cnpss.sisenom.view.agenda.table;

import java.awt.Component;import javax.swing.JComponent;import javax.swing.JTable;import javax.swing.table.TableCellRenderer;import org.apache.log4j.Logger;

Page 9: 106879922 Tabla Con JComboBox en Columna

public class MiRender implements TableCellRenderer {

// Este metodo indica como debe de pintarse el elemento en la fila row, en la columna column // que esta en la tabla table y tiene el color dado por el objeto. @Override public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {

// como el boton y el calendario son componentes esto se vale. return (JComponent) table.getValueAt(row, column);}}

Finalmente se crea el editor, al igual que con el render en el editor indicaremos que debe usarse el editor del propio componente.

package mx.gob.cnpss.sisenom.view.agenda.table;

import java.awt.Component;import javax.swing.AbstractCellEditor;import javax.swing.JComponent;import javax.swing.JTable;import javax.swing.table.TableCellEditor;import org.apache.log4j.Logger;

/*** @author gatsu*/public class MiEditor extends AbstractCellEditor implements TableCellEditor {

private Boolean currentValue;

@Override public Object getCellEditorValue() { return currentValue; }

//El editor usara el propio componente. Para que funcione la celda en el modelo debe ser editable. @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

Page 10: 106879922 Tabla Con JComboBox en Columna

return (JComponent) value;// la tabla solo debe tener componentes graficos

}}

Finalmente, hay que asignar el modelo, el render y el editor al JTable deseado.

JTable tablita = new JTable();tablita.setModel( new MiModelo());

// solo las celdas con botones se pintaran y usaran como botones.tablita.setDefaultRender( JButton.class, new MiRender());tablita.setDefaultEditor( JButton.class, new MiEditor());

Si se desea que las celdas con JDateChosser también trabajen igual se agregaran las siguientes lineas:

tablita.setDefaultRender( JDateChooser.class, new MiRender());tablita.setDefaultEditor( JDateChooser.class, new MiEditor());

JCheckBox en la Cabecera de un JTable

En esta entrada veremos como podemos colocar un JCheckBox o cualquier componente en la cabecera de una tabla. El ejemplo que veremos podremos seleccionar todas las filas de una tabla solo con seleccionar el JCheckBox que esta en la cabecera.

Imágenes

Page 11: 106879922 Tabla Con JComboBox en Columna

Código

Clase Principal

package Clases;

import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;

public class Principal extends JApplet { JTable tabla; JScrollPane scroll; DefaultTableModel modelo; Object [] nomcolumnas={"","Nombre","Url"}; Object [][] datos=new Object[3][3]; TableColumn Tcol; JCheckBoxHeader chkheader; JButton eliminar; public void init(){ modelo=new DefaultTableModel(datos, nomcolumnas); tabla=new JTable(modelo); tabla.setValueAt("Java Zone", 0, 1); tabla.setValueAt("www.java-elrincondetucasa.tk", 0, 2); tabla.setValueAt("Google", 1, 1); tabla.setValueAt("www.google.com.co", 1, 2);

Page 12: 106879922 Tabla Con JComboBox en Columna

Tcol=tabla.getColumnModel().getColumn(0); Tcol.setCellEditor(tabla.getDefaultEditor(Boolean.class));      Tcol.setCellRenderer(tabla.getDefaultRenderer(Boolean.class));    chkheader=new JCheckBoxHeader(tabla); Tcol.setHeaderRenderer(chkheader); eliminar=new JButton("Eliminar"); eliminar.addActionListener(new ActionListener(){

@Override public void actionPerformed(ActionEvent e) { for(int i=0;i<tabla.getRowCount();i++){ if(tabla.getValueAt(i, 0)!=null){ chkheader.chk.setSelected(false); tabla.setValueAt(false, i, 0); tabla.setValueAt("", i, 1); tabla.setValueAt("", i, 2); repaint(); tabla.updateUI(); } } } }); scroll=new JScrollPane(tabla); add(scroll); JPanel pboton=new JPanel(); pboton.add(eliminar); add(pboton,BorderLayout.SOUTH); }}

Clase JCheckBoxHeader

package Clases;

import java.awt.Component;import java.awt.event.*;import javax.swing.*;import javax.swing.table.JTableHeader;import javax.swing.table.TableCellRenderer;import javax.swing.table.TableColumnModel;

public class JCheckBoxHeader extends JPanel implements TableCellRenderer,

Page 13: 106879922 Tabla Con JComboBox en Columna

MouseListener {      int column;    boolean mousePressed = false;    JTable tabla;  JCheckBox chk;    public JCheckBoxHeader(JTable t) {  tabla=t;  chk=new JCheckBox();  chk.addItemListener(new ItemListener(){

@Override public void itemStateChanged(ItemEvent e) {      for(int x = 0, x<tabla.getRowCount(); x++)        {          tabla.setValueAt(new Boolean(chk.isSelected()),x,0);        }   }        });  add(chk);  }    public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {      if (table != null) {        JTableHeader cabecera = table.getTableHeader();        if (cabecera != null) {      cabecera.addMouseListener(this);        }      }      return this;    }      public void seleccionar(MouseEvent e){  TableColumnModel Modelocolumna = tabla.getColumnModel();    int columnaactual = Modelocolumna.getColumnIndexAtX(e.getX());    

 if (columnaactual == 0) {    if(chk.isSelected()){  chk.setSelected(false);  }else{  chk.setSelected(true);  }  }    ((JTableHeader)e.getSource()).repaint();   }  

Page 14: 106879922 Tabla Con JComboBox en Columna

  public void mouseClicked(MouseEvent e) {    seleccionar(e);  }    public void mousePressed(MouseEvent e) {    seleccionar(e);   }    public void mouseReleased(MouseEvent e) {    }    public void mouseEntered(MouseEvent e) {    }    public void mouseExited(MouseEvent e) {    }  }

La clase Principal crea un JTabel, un botón para eliminar las filas seleccionados, ademas un objeto JCheckBoxHeader que es la clase que nos va a ayudar a colocar el JCheckBox en la cabecera.

La clase JCheckBoxHeader es un JPanel y ademas implementa la interfaz TableCellRenderer para sobreescribir el metodo getTableCellRendererComponent el cual devuelve un objeto Component, en este caso nuestro JPanel con el JCheckBox.

Indicamos que al darle clic seleccione todas las filas de la tabla y al darle clic otra vez se deseleccionan todas las filas