Вы находитесь на странице: 1из 14

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 varan, como el sexo (Masculino o Femenino), ao, 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.

Imgenes

Cdigo 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; 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); } });

pbotones.add(agregar); add(pbotones,BorderLayout.SOUTH); } } Como vemos el cdigo 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 mtodo 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 mtodo 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.

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 cdigo para ver si alguno detecta el problema: Code: [Select]
import import import import import import java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.table.*; javax.swing.event.*; java.sql.*;

/** * Panel con toda la parte visual del ejemplo. Crea un JScrollPane con el JTable * en su interior y dos JButton para aadir 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 aadir 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;

// 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 mtodo 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 aade todo al panel this.add(scroll, restricciones); // Un botn para aadir nuevas filas. // Su posicin en el panel ... restricciones.gridy = 1; restricciones.gridwidth = 1;

restricciones.weighty = 0.0; restricciones.fill = GridBagConstraints.NONE; restricciones.anchor = GridBagConstraints.WEST; // Se crea el botn JButton botonAnhadir = new JButton ("Aadir"); // Se aade al panel this.add (botonAnhadir, restricciones); // y se le pone la accin a ejecutar cuando se pulse. botonAnhadir.addActionListener(new ActionListener() { public void actionPerformed (ActionEvent evento) { control.agregaFila(); } }); // Un botn para borrar filas. // La posicin en el panel... restricciones.gridx = 3; restricciones.weightx = 0.0; restricciones.anchor = GridBagConstraints.EAST; // se crea el botn JButton botonBorrar = new JButton ("Borrar"); // se aade al panel this.add (botonBorrar, restricciones); // y se le aade la accin 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;

/** 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 implementacin de la interfaz TableCellRenderer para mostrar algunas celdas como botones o como Calendarios. 2. Crear una implementacin 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 import import 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

{ // 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 import import import import java.awt.Component; javax.swing.JComponent; javax.swing.JTable; javax.swing.table.TableCellRenderer; org.apache.log4j.Logger;

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 import import import import import java.awt.Component; javax.swing.AbstractCellEditor; javax.swing.JComponent; javax.swing.JTable; javax.swing.table.TableCellEditor; 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) {

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 tambin 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.

Imgenes

Cdigo 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);

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,

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(); }

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 botn 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