2010-01-15 11 views
8

¿Es posible agregar botones dentro de la celda JTable junto con los datos? Lo que intento hacer es crear una tabla con columnas que muestren datos (número) de la base de datos, y dos botones para aumentar/disminuir el número dentro de la misma celda.Agregar botones dentro de la celda de JTable junto con los datos?

| ID | Cantidad |
| 06 | 2 [+] [-] |

sería algo como arriba con [+] [-] siendo botones. Así que cuando presione [+], el número cambiará a 3 y 1 si presiona [-].

Respuesta

15

Sí, es posible, aunque no será fácil.

Tienes que escribir tu propia cell renderer personalizada y tu propia cell editor.

Esta es una muestra que hice en 5 minutos:

sample

Está lejos de ser perfecta, pero muestra el concepto.

Aquí está el código fuente:

import java.awt.Component; 
import java.awt.Font; 
import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.Dimension; 

public class CustomCell { 
    public static void main(String [] args) { 
     Object [] columnNames = new Object[]{ "Id", "Quantity" }; 
     Object [][] data  = new Object[][]{ {"06", 1}, {"08", 2} }; 

     JTable table = new JTable(data, columnNames) { 
      public TableCellRenderer getCellRenderer(int row, int column) { 
       return new PlusMinusCellRenderer(); 
      } 
     }; 

     table.setRowHeight(32); 
     showFrame(table); 
    } 

    private static void showFrame(JTable table) { 
     JFrame f = new JFrame("Custom Cell Renderer sample"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

class PlusMinusCellRenderer extends JPanel implements TableCellRenderer { 
     public Component getTableCellRendererComponent(
          final JTable table, Object value, 
          boolean isSelected, boolean hasFocus, 
          int row, int column) { 
       this.add(new JTextField(value.toString() )); 
       this.add(new JButton("+")); 
       this.add(new JButton("-")); 
       return this; 
     } 
} 

Aquí hay un hilo que puede ser interesting y here.

+1

¿Es posible agregar actionListeners a estos botones? – cp101020304

+0

Los botones no se pueden hacer clic; ¿Tendría que agregar mi propio MouseListener o algo así para que esto funcione? – ricky3350

1

Creo que debe crear un procesador de celdas personalizado si desea mostrar algo más que texto (o números) en la celda. El trabajo del renderizador de celdas es pintar todo lo que necesites para mostrar en la celda.

Ver Table Renderer documentation.

En este caso, podría crear un JPane pequeño que contenga el campo de texto y los minúsculos botones + y - o simplemente un componente JSpinner, si hace lo que necesita. Un poco complicado, seguro, pero debería ser posible.

1

Como se discutió en el tutorial, necesitará un representador para mostrar su valor y un editor para detectar eventos de la celda que se está editando. En este example, el Component es un JCheckBox. Tenga en cuenta que esto requiere un DataModel personalizado que extienda AbstractTableModel para suministrar el Class correcto para una columna determinada. La sugerencia de Joonas de usar JSpinner es buena y funciona bien.

Cuestiones relacionadas