Pergunta

É possível adicionar botões dentro da célula jtable junto com dados? O que estou tentando fazer é criar uma tabela com colunas que exibam dados (número) do banco de dados e dois botões para aumentar/diminuir o número dentro da mesma célula.

| Id | Quantidade |
|06| 2 [+][-] |

Seria algo como acima com [+] [-] sendo botões. Então, quando eu pressionar [+], o número será alterado para 3 e 1 se pressionar [-].

Foi útil?

Solução

Sim, é possível, embora não seja fácil.

Você tem que escrever seu próprio costume Renderizador de células e seu próprio Editor de células.

Esta é uma amostra que fiz em 5 minutos:

sample

Está longe de ser perfeito, mas mostra o conceito.

Aqui está o código -fonte:

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

Aqui está um tópico que pode ser interessante e aqui.

Outras dicas

Conforme discutido no tutorial Você precisará de um renderizador para exibir seu valor e um editor para detectar eventos da célula que está sendo editada. Nisso exemplo, a Component é um JCheckBox. Observe que isso requer um costume DataModel isso se estende AbstractTableModel Para fornecer o correto Class Para uma determinada coluna. A sugestão de Joonas para usar JSpinner é bom que funciona bem.

Eu acho que você precisa criar um renderizador de células personalizado se quiser mostrar qualquer outra coisa além do texto (ou números) na célula. O trabalho do renderizador de células é pintar o que você precisa mostrar na célula.

Ver Documentação do renderizador da tabela.

Portanto, neste caso, você pode criar um pequeno jpane que contém o campo de texto e os botões Tiny + e - - ou um componente JSPinner, se fizer o que você precisa. Um pouco complicado, com certeza, mas deve ser possível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top