Foros del Web » Programación para mayores de 30 ;) » Java »

Agregar JButton a JTable

Estas en el tema de Agregar JButton a JTable en el foro de Java en Foros del Web. Hola me gustaria saber si alguien sabe como se puede agregar un JButton a un JTable o sea la idea es que tengo una tabla ...
  #1 (permalink)  
Antiguo 12/09/2008, 19:07
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Agregar JButton a JTable

Hola me gustaria saber si alguien sabe como se puede agregar un JButton a un JTable o sea la idea es que tengo una tabla cargadas con filas y cada fila deberia tener un boton en su ultima columna, cuando el usuario picha en el boton la idea es mostrar un frame que despliegue un historial de la fila q presiono

saludos y muchas gracias
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #2 (permalink)  
Antiguo 13/09/2008, 12:41
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Primero debes implementar un TableCellRenderer, encargado de dibujar el botón.

Código:
public class myrenderer extends JLabel implements TableCellRenderer {

    boolean isBordered = true;

    public myrenderer(boolean isBordered) {
        this.isBordered = isBordered;
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {
        // Va a mostrar el botón solo en la última fila.
        // de otra forma muestra un espacio en blanco.
        if (row == table.getModel().getRowCount() - 1) {
            return new JButton("Agregar");
        } else {
            setBackground(new Color(0xffffff));
            return this;
        }
    }
}
Después tienes que implementar un TableCellEditor, encargado de las operaciones de edición, (activación del botón).

Código:
public class myeditor extends AbstractCellEditor implements TableCellEditor, ActionListener {

    Boolean currentValue;
    JButton button;
    protected static final String EDIT = "edit";
    private JTable jTable1;

    public myeditor(JTable jTable1) {
        button = new JButton();
        button.setActionCommand(EDIT);
        button.addActionListener(this);
        button.setBorderPainted(false);
        this.jTable1 = jTable1;
    }

    public void actionPerformed(ActionEvent e) {
        // mymodel t = (mymodel) jTable1.getModel();
        // t.addNewRecord();
        fireEditingStopped();
    }

    //Implement the one CellEditor method that AbstractCellEditor doesn't.
    public Object getCellEditorValue() {
        return currentValue;
    }

    //Implement the one method defined by TableCellEditor.
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        // Va a mostrar el botón solo en la última fila.
        // de otra forma muestra un espacio en blanco.
        if (row == table.getModel().getRowCount() - 1) {
            currentValue = (Boolean) value;
            return button;
        }
        return new JLabel();
    }
}
Y después tienes que modificar el table

Código:
TableColumn agregarColumn;
agregarColumn = jTable1.getColumnModel().getColumn(5);
agregarColumn.setCellEditor(new myeditor(jTable1));
agregarColumn.setCellRenderer(new myrenderer(true));
Saludos.

Más información en el Tutorial de Java de SUN:
http://java.sun.com/docs/books/tutor...tml#editrender
  #3 (permalink)  
Antiguo 13/09/2008, 18:28
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Agregar JButton a JTable

Muchas gracias por el ejemplo me ha servido de mucho, todo me funciona ok solo tengo un pequeño detalle me gustaria poner el ancho de esa columna del mismo alto que las filas o sea un cuadrado de altofila x altofila no se si me entiendes

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #4 (permalink)  
Antiguo 13/09/2008, 21:25
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

No estoy seguro, pero creo que al variar el tamaño del JButton que devuelve el CellRenderer y el CellEditor; la tabla tendrá que ajustarse automáticamente. Tendrías que obtener el ancho de la columna y especificárselo en el Minimun o PreferedSize del JButton.

Pero tendría que probarlo para estar seguro.

Saludos.
  #5 (permalink)  
Antiguo 14/09/2008, 11:54
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Agregar JButton a JTable

ok gracias lo pruebo
saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #6 (permalink)  
Antiguo 15/09/2008, 06:49
 
Fecha de Ingreso: septiembre-2008
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Buenas, he probado el código que proporcionais aquí y obtengo una excepción al pulsar el botón agregar. Lo único que me gustaría es que apareciese un texto cuando pulso el botón, ¿Donde tendría que incluir el código que quiero que se ejecute cuando pulso el botón?

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at myeditor.getTableCellEditorComponent(myeditor.java :45)
at javax.swing.JTable.prepareEditor(Unknown Source)



He creado dos clases myrenderer y myeditor y una clase principal que sería como sigue:


public class Principal {


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

public Principal() {
JFrame frame = new JFrame("TreeTable");
JTable mitabla;

Object[][] data = {

{"David Alis", new Integer (25), new Integer (934234234)},
{"Kathya Walrath", new Integer (25), new Integer (934234234)},

};

String[] columnNames =
{"Nombre y Apellidos", "Edad", "Nº Privado"};

//Creamos el modelo de datos por defecto
DefaultTableModel dtm= new DefaultTableModel(data, columnNames);


//Creamos la vista de la tabla a partir del modelo de datos
mitabla = new JTable (dtm);


TableColumn agregarColumn;

//Fijamos la columna donde irá el botón
agregarColumn = mitabla.getColumnModel().getColumn(0);
agregarColumn.setCellEditor(new myeditor(mitabla));
agregarColumn.setCellRenderer(new myrenderer(true));

frame.getContentPane().add(new JScrollPane(mitabla));
frame.pack();
frame.show();
}


}

Gracias por adelantado
  #7 (permalink)  
Antiguo 15/09/2008, 19:39
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Te da un error por que estas tratando de poner el botón en la columna 0. Y la columna 0 es de tipo String, (donde tienes los nombres), mientras que myeditor espera un Boolean; la idea es tener una columna vacía que sirva como contenedor del botón. Por lo que el código debería de quedar algo así (no lo he probado):

Cita:
Iniciado por David2008 Ver Mensaje

Object[][] data = {

{"David Alis", new Integer (25), new Integer (934234234), false}, // columna 3 boolean
{"Kathya Walrath", new Integer (25), new Integer (934234234), false},

};

String[] columnNames =
{"Nombre y Apellidos", "Edad", "Nº Privado", "Boton"};

//Creamos el modelo de datos por defecto
DefaultTableModel dtm= new DefaultTableModel(data, columnNames);


//Creamos la vista de la tabla a partir del modelo de datos
mitabla = new JTable (dtm);


TableColumn agregarColumn;

//Fijamos la columna donde irá el botón
agregarColumn = mitabla.getColumnModel().getColumn(3); // columna 3
agregarColumn.setCellEditor(new myeditor(mitabla));
agregarColumn.setCellRenderer(new myrenderer(true));

frame.getContentPane().add(new JScrollPane(mitabla));
frame.pack();
frame.show();
}


}
Y la acción a ejecutar le escribes en el CellEditor :

Código:
    public void actionPerformed(ActionEvent e) {
        // Cuando presione el botón
        // se ejecuta este código.
        fireEditingStopped();
    }

Saludos.

Última edición por HackmanC; 15/09/2008 a las 20:17 Razón: red
  #8 (permalink)  
Antiguo 23/09/2008, 06:45
 
Fecha de Ingreso: septiembre-2008
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Buenas,

Primero muchas gracias por contestar.

Acabo de encontrar otro problema:

Tengo en la primera columna de mi tabla rellena de botones. Cuando ejecuto y pincho sobre cualquier botón me captura el evento y salta al método actionperformed sin problema. El problema es que cuando pincho sobre otro botón tras pinchar la primera vez no me detecta el evento. Es decir, justo al ejecutar mis botones actuan bien, pero si ya he pulsado uno antes, para que se ejecute el método actionperformed en los otros tengo que pinchar 2 veces, ya que la primera vez que pincho no me hace nada.

Un saludo y gracias
  #9 (permalink)  
Antiguo 23/09/2008, 12:50
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Tienes la llamada a esta función "fireEditingStopped()" al terminar de ejecutar tu código en el evento actionPerformed ?

Saludos.
  #10 (permalink)  
Antiguo 25/09/2008, 03:22
 
Fecha de Ingreso: septiembre-2008
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Exactamente era eso. Muchas gracias. Todo solucionado, ...., de momento
  #11 (permalink)  
Antiguo 29/11/2008, 15:48
 
Fecha de Ingreso: noviembre-2008
Mensajes: 1
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Amigo una pregunta, es que necesito incluir el boton para eliminar ese registro a donde esta asociado me comprende o sea necesito obtener los datos de ese row... no entiendo como programar el codigo para cada fila? o es el mismo para todas???? me refiero al evento del boton... gracias por su ayuda.
  #12 (permalink)  
Antiguo 29/11/2008, 22:07
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Cita:
Iniciado por oscarkof Ver Mensaje
... necesito incluir el boton para eliminar ese registro a donde esta asociado me comprende o sea necesito obtener los datos de ese row... no entiendo como programar el codigo para cada fila? o es el mismo para todas????
En el código anterior se implementó dentro de la clase AbstractCellEditor, una variable privada llamada 'jTable1', que se recibe en el constructor ... y está comentada en el método 'actionPerformed', está comentada por que en ese ejemplo esa variable no tiene ningún uso ... pero ...

Cita:
Iniciado por HackmanC Ver Mensaje
Código:
public class myeditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
    ...
    private JTable jTable1;
    public myeditor(JTable jTable1) {
        ....
        this.jTable1 = jTable1;
    }

    public void actionPerformed(ActionEvent e) {
        // mymodel t = (mymodel) jTable1.getModel();
        // t.addNewRecord();
        fireEditingStopped();
    }
    ...
}
... el objetivo es tener acceso al modelo de datos desde el evento del botón, cuando se presiona el botón, se llama al evento actionPerformed, y desde allí puedes agregar o eliminar filas al TableModel.

Lo único que hace falta es saber cual es la fila seleccionada, el JTable tiene un método 'editingRow' que debe devolver el indice de dicha fila, (o puedes usar getSelectedRows).

Una vez obtenido puedes eliminarlo del table model y llamar el método fireTableDataChanged() o fireTableRowsDeleted() después de fireEditingStopped(), para que el JTable muestre los cambios.

Saludos,

ps:

El TableModel tiene que ser uno personalizado, tienes que hacer una clase que implemente la interfaz AbstractTableModel, que tenga acceso directo a una Lista de valores (LinkedList, etc), donde se puede agregar y eliminar. Si usas Arrays para llenar la Tabla no se pueden eliminar ni agregar filas, por que los Arrays son inmutables (creo !? ).

Última edición por HackmanC; 29/11/2008 a las 22:20 Razón: ps
  #13 (permalink)  
Antiguo 05/11/2010, 11:49
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola buenas tardes,

He implementado la clase TableCellRender y TableCellEditor y modificado la jtable para adiccionar el boton el la última columna de jatble.

Ahora bien , el problema que tengo es que al pinchar sobre el boton y querer pasar como parametros los datos de la fila seleccionada del jtable, los parametros se pierden ya que estas dos clases son instanciadas desde el constructor que es donde en realidad se muestra la data .. No se como hacer para que al pinchar el boton pase los parametros de la fila seleccionada y se muestre en el siguiente applet que se esta invocando..

Gracias de antemano
  #14 (permalink)  
Antiguo 10/11/2010, 13:16
 
Fecha de Ingreso: mayo-2010
Mensajes: 11
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

hola primero que nada espero que no te enojes que tome prestado tu codigo... pero es muy interesante... yo lo aplique para que pudiera ingresar unos datos en la celda que selecciono pero una ves que ingreso el dato no me lo muestra en la celda, si esta hay pero no lo muestra a ver si ustedes me pueden ayudar
Código:
package xbase3;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

public class myeditor extends AbstractCellEditor implements TableCellEditor, ActionListener {

    Boolean currentValue;
    JButton button;
    JTextField claveLabor;
    int fila=0,col=0;
    protected static final String EDIT = "edit";
    private JTable jTable1;

    public myeditor(JTable jTable2) {
        button = new JButton();
        button.setActionCommand(EDIT);
        button.addActionListener(this);
        button.setBorderPainted(true);
        button.setSize(5, 5);
        this.jTable1 = jTable2;
}
    public void actionPerformed(ActionEvent e) {
        Object n="hmun";//dato de prueba
        fila = jTable1.getSelectedRow();//obtengo la fila
        col = jTable1.getSelectedColumn();//obtengo la columna
        jTable1.getModel().setValueAt(n, fila, col);
        JOptionPane.showMessageDialog(null, jTable1.getModel().getValueAt(0, 0));//aqui verifico si esta el mensaje que puse
        fireEditingStopped();
    }

    public Object getCellEditorValue() {
        return currentValue;
    }

    
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        if (row == table.getModel().getRowCount() - 1) {
            currentValue = (Boolean) value;
            return button;
        }
        return new JLabel();
    }
}
  #15 (permalink)  
Antiguo 10/10/2011, 08:57
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola! En el código la llamada al método fireEditingStopped(); me da error, porque no existe, me podrías proporcionar el código del mismo....

Gracias
  #16 (permalink)  
Antiguo 10/10/2011, 10:03
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Cita:
Iniciado por jdmc Ver Mensaje
Hola! En el código la llamada al método fireEditingStopped(); me da error, porque no existe, me podrías proporcionar el código del mismo....
El método fireEditingStopped() está implementado en la clase javax swing AbstractCellEditor. Al extender la clase AbstractCellEditor se hereda dicho método.

Saludos,
  #17 (permalink)  
Antiguo 10/10/2011, 11:38
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola! Gracias por la información, no había hecho el extends :s Otra cosa, necesito que una vez se seleccione el botón, se ejecute un código ya implementado, la pregunta es: Donde tendría que colocar la llamada al procedimiento que necesito????

Gracias
  #18 (permalink)  
Antiguo 10/10/2011, 13:00
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola! Por lo que estuve observando la llamada al método debo colocarla en el actionperformed, pero si le doy click al botón nmo hace absolutamente nada :s, y aparte solo me aparece el botón, en el último registro de la tabla y no en todos, si me puedes ayudar, te lo agradecería, estoy contra tiempo.

Saludos
  #19 (permalink)  
Antiguo 10/10/2011, 19:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Cita:
Iniciado por jdmc Ver Mensaje
... Por lo que estuve observando la llamada al método debo colocarla en el actionperformed, pero si le doy click al botón nmo hace absolutamente nada :s, ...
Habría que ver el código para saber que hiciste o copiaste mal.

Cita:
Iniciado por jdmc Ver Mensaje
.. y aparte solo me aparece el botón, en el último registro de la tabla y no en todos, ...
Código:
    public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {
        // Va a mostrar el botón solo en la última fila.
        // de otra forma muestra un espacio en blanco.
        if (row == table.getModel().getRowCount() - 1) {
            return new JButton("Agregar");
        } else {
            setBackground(new Color(0xffffff));
            return this;
        }
    }
Si leíste y comprendiste bien el código creo que es más que evidente el problema.

Cita:
Iniciado por jdmc Ver Mensaje
.. estoy contra tiempo. ...


Saludos,
  #20 (permalink)  
Antiguo 11/10/2011, 06:34
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola! Aquí está el código que copie, y en el actionPerformed se encuentran las nuevas líneas que llaman al proceso que necesito que se ejcute.

Cita:
public class myeditor extends AbstractCellEditor implements TableCellEditor, ActionListener{

private static final long serialVersionUID = 1L;
Boolean currentValue;
JButton avisos;
protected static final String EDIT = "edit";
private JTable jTable1;

public myeditor(JTable jTable1) {
avisos = new JButton();
avisos.setActionCommand(EDIT);
avisos.addActionListener((ActionListener) this);
avisos.setBorderPainted(false);
avisos.setSize(10, 10);
this.jTable1 = jTable1;
}

public void actionPerformed(ActionEvent e) {
XX_PlanWeekPayForm f = new XX_PlanWeekPayForm();
f.cmdAvisos();

fireEditingStopped();
}

/**
* Implement the one CellEditor method that AbstractCellEditor doesn't.
*/
public Object getCellEditorValue() {
return currentValue;
}

/**
* Implement the one method defined by TableCellEditor.
*/
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
//Va a mostrar el botón solo en la última fila de otra forma muestra un espacio en blanco.
// if (row == table.getModel().getRowCount() - 1) {
currentValue = (Boolean) value;
return avisos;
// }
return new JLabel();
}
Gracias

Saludos
  #21 (permalink)  
Antiguo 11/10/2011, 06:43
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola!, Y aquí está el código de donde hago la llamada en el proceso

Cita:
xTablePartner.getColumnModel().getColumn(5).setMin Width(100);
xTablePartner.getColumnModel().getColumn(5).setCel lRenderer(new myrenderer(true));
xTablePartner.getColumnModel().getColumn(5).setCel lEditor(new myeditor(xTablePartner));
Saludos
  #22 (permalink)  
Antiguo 11/10/2011, 13:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Agregar JButton a JTable

Hola,

Prueba a hacer lo siguiente:

Código Java:
Ver original
  1. @Override
  2.     public void actionPerformed(ActionEvent e) {
  3.         System.out.println("HOLA");
  4.         fireEditingStopped();
  5.     }

No sé que es lo que hace f.cmdAvisos(); pero si te aparece la palabra HOLA en la consola al presionar el botón, entonces el problema no es de la tabla, ni el render, ni el editor. Hice una prueba en NetBeans con el código que mostraste y a mi me funciona correctamente, muestra la palabra en la consola.

Saludos,
  #23 (permalink)  
Antiguo 17/10/2011, 05:48
 
Fecha de Ingreso: diciembre-2010
Mensajes: 6
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

Hola! Probé el código que me recomendaste, pero no funciona. Estuve realizando un debug, y la corrida no pasa por ninguna de las dos clases. No se, si quizás sea por tener un actionlistener en la tabla, haciendo que cada vez que realice una acción dentro de la misma ejecute el código que se encuentra en el valuechanged y no permita ejecutar el código que esta en el meditor :S

La llamada a las clases mrender y meditor las realizo justo cuando diseño la tabla y no cuando la lleno, pero no creo que tenga algo que ver. Visualmente me aparece el botón, pero cuando lo presione, se va directamente al valuechanged, será que tienes alguna solución para ello?? o como podría darle la vuelta para lograr el funcionamiento???

Espero tu respuesta.
  #24 (permalink)  
Antiguo 03/02/2015, 17:59
Avatar de cesar203  
Fecha de Ingreso: enero-2010
Ubicación: LIMA
Mensajes: 27
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Agregar JButton a JTable

me podrian ayudar a mi ya que tengo alg similar esta en otro post:
http://www.forosdelweb.com/f45/poner-jbutton-jtable-1119960/

porfavor

buuuuuuuuuuuuuu...........
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:48.