[RESOLVIDO] Inserir botão na JTable

Bom dia senhores…
Como faço para inserir um botão em uma tabela.
Quero inserí-lo na coluna 2 por exemplo.

Ajudem-me…Abraços!

Código tirado do link http://www.devx.com/getHelpOn/10MinuteSolution/20425

[code]import java.awt.;
import java.awt.event.
;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

class JTableButtonRenderer implements TableCellRenderer {
private TableCellRenderer __defaultRenderer;

public JTableButtonRenderer(TableCellRenderer renderer) {
__defaultRenderer = renderer;
}

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
if(value instanceof Component)
return (Component)value;
return __defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
}

class JTableButtonModel extends AbstractTableModel {
private Object[][] __rows = {
{ “One”, new JButton(“Button One”) },
{ “Two”, new JButton(“Button Two”) },
{ “Three”, new JButton(“Button Three”) },
{ “Four”, new JButton(“Button Four”) }
};

private String[] __columns = { “Numbers”, “Buttons” };

public String getColumnName(int column) {
return __columns[column];
}

public int getRowCount() {
return __rows.length;
}

public int getColumnCount() {
return __columns.length;
}

public Object getValueAt(int row, int column) {
return __rows[row][column];
}

public boolean isCellEditable(int row, int column) {
return false;
}

public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}

class JTableButtonMouseListener implements MouseListener {
private JTable __table;

private void __forwardEventToButton(MouseEvent e) {
TableColumnModel columnModel = __table.getColumnModel();
int column = columnModel.getColumnIndexAtX(e.getX());
int row = e.getY() / __table.getRowHeight();
Object value;
JButton button;
MouseEvent buttonEvent;

if(row >= __table.getRowCount() || row < 0 ||
   column >= __table.getColumnCount() || column < 0)
  return;

value = __table.getValueAt(row, column);

if(!(value instanceof JButton))
  return;

button = (JButton)value;

buttonEvent =
  (MouseEvent)SwingUtilities.convertMouseEvent(__table, e, button);
button.dispatchEvent(buttonEvent);
// This is necessary so that when a button is pressed and released
// it gets rendered properly.  Otherwise, the button may still appear
// pressed down when it has been released.
__table.repaint();

}

public JTableButtonMouseListener(JTable table) {
__table = table;
}

public void mouseClicked(MouseEvent e) {
__forwardEventToButton(e);
}

public void mouseEntered(MouseEvent e) {
__forwardEventToButton(e);
}

public void mouseExited(MouseEvent e) {
__forwardEventToButton(e);
}

public void mousePressed(MouseEvent e) {
__forwardEventToButton(e);
}

public void mouseReleased(MouseEvent e) {
__forwardEventToButton(e);
}
}

public final class JTableButton extends JFrame {
private JTable __table;
private JScrollPane __scrollPane;

public JTableButton() {
super(“JTableButton Demo”);
TableCellRenderer defaultRenderer;

__table = new JTable(new JTableButtonModel());
defaultRenderer = __table.getDefaultRenderer(JButton.class);
__table.setDefaultRenderer(JButton.class,
		       new JTableButtonRenderer(defaultRenderer));
__table.setPreferredScrollableViewportSize(new Dimension(400, 200));
__table.addMouseListener(new JTableButtonMouseListener(__table));

__scrollPane = new JScrollPane(__table);
setContentPane(__scrollPane);

}

public static void main(String[] args) {
Frame frame;
WindowListener exitListener;

exitListener = new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
Window window = e.getWindow();
window.setVisible(false);
window.dispose();
System.exit(0);
  }
};

frame = new JTableButton();
frame.addWindowListener(exitListener);
frame.pack();
frame.setVisible(true);

}
}[/code]

Espero que ajude!

Abraços!

Dá uma olhada em TableRenderer e TableEditor:


http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#editrender

Fernando

Filho,

Cria essa inner:

[code]class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener
{
JTable table;
JButton renderButton;
JButton editButton;
String text;

    public ButtonColumn(JTable table, int column)
    {
        super();
        this.table = table;
        renderButton = new JButton();

        editButton = new JButton();
        editButton.setFocusPainted( false );
        editButton.addActionListener( this );

        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(column).setCellRenderer( this );
        columnModel.getColumn(column).setCellEditor( this );
    }

    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (hasFocus)
        {
            renderButton.setForeground(table.getForeground());
            renderButton.setBackground(UIManager.getColor("Button.background"));
        }
        else if (isSelected)
        {
            renderButton.setForeground(table.getSelectionForeground());
             renderButton.setBackground(table.getSelectionBackground());
        }
        else
        {
            renderButton.setForeground(table.getForeground());
            renderButton.setBackground(UIManager.getColor("Button.background"));
        }

        renderButton.setText( (value == null) ? "" : value.toString() );
        return renderButton;
    }

    public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column)
    {
        text = (value == null) ? "" : value.toString();
        editButton.setText( text );
        return editButton;
    }

    public Object getCellEditorValue()
    {
        return text;
    }

    public void actionPerformed(ActionEvent e)
    {
        fireEditingStopped();
        System.out.println( e.getActionCommand() + " : " + table.getSelectedRow());
    }
}[/code]

Depois chama desta forma:

// Create button column ButtonColumn buttonColumn = new ButtonColumn(table, 4);

Apesar de eu estar sentada a uma cadeira de distancia, resolvi responder por aqui… Tenta ai!

1 curtida

Tipo,
não precisa dizer se funcionou…

Tchauzin!

Sei que o tópico é antigo, mas precisei fazer uma coisinha parecida aqui e foi bem útil e como o autor do tópico sequer agradeceu, eu mesmo faço isso.
Obrigado Lina, pela contribuição.

drsmachado

Agradeci a Lina pessoalmente quando a conheci em um curso de Java que fiz em São Paulo e ela estava.

Inclusive, hoje eu trabalho com ela em uma empresa de desenvolvimento em Java.

Mas de qualquer forma, agradeço novamente (acabei de falar pra ela. Ela está aqui do meu lado rsrsrsrsrs).

Abraço!

Via mp (mensagem pessoal) não tem como adivinhar…

Beleza drsmachado.

Não fica chateado. rsrsrsrs

Já coloquei [RESOLVIDO] no título.

Abraço!

De boa.
Esses dias eu estava com uma amnésia em JSF 2 e ajax, quando fui pesquisar, vi um tópico que eu mesmo respondi e o autor nem voltou pra dizer se funcionou. Para mim funcionou quando respondi e quando fui pesquisar de novo.

Te deixo uma dica então: “Durma mais e melhor que passa”. rsrsrsrsrs

Abraço!

Galera,

desculpem ta ressucitando o post mas alguém pode me dar um exemplo de alguma ação para o botão criado?

to adicionando o botão a tabela direitinho, só não estou consseguindo implementar um listener pra ele.

Valeu

Também estou com a dúvida do aomj_raca1.
Consegui inserir o botão, mas não consegui colocar uma ação no botão.
Alguém tem uma luz para nos dar?

Obrigado

Estava com o mesmo problema de inserir o botão na JTable e ele não ter ação nenhuma.
Resolvi o problema fazendo minha própria solução:
Renderizar um botão na célula e ao clicar ou teclar “Enter” sobre a coluna do botão ele executa uma ação

O exemplo é de um cardápio de lanches que para ver o preço deve-se clicar sobre o botão “Ver preço” ou pressionar Enter quando a coluna estiver selecionada.

Coloque todo o código a seguir num arquivo chamado de “Cardapio.java” e execute o método “main”, como uma aplicação java comun.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class Cardapio extends JFrame {

    private static final long serialVersionUID = 4434690587649948410L;
    private JPanel contentPane;
    private JTable lanches;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Cardapio frame = new Cardapio();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Cardapio() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        
        JTable lanches = getLanches();
        contentPane.add(lanches, BorderLayout.CENTER);

        adicioneOsLanchesDisponiveisNessaTabela(lanches);
        adicioneBotaoDeVerPrecoNaUltimaColunaDessaTabela(lanches);
    }

    private void adicioneOsLanchesDisponiveisNessaTabela(JTable lanches) {
        lanches.setModel(new LanchesDisponiveis());
    }

    private static void adicioneBotaoDeVerPrecoNaUltimaColunaDessaTabela(
            JTable tabela) {
        tabela.setDefaultRenderer(Lanche.class, VerPrecoRenderer.getInstanciaUnica());
        VerPrecoListener tabListener = new VerPrecoListener(tabela);
        tabela.addKeyListener(tabListener);
        tabela.addMouseListener(tabListener);
    }

    private JTable getLanches() {
        if (lanches == null) {
            lanches = new JTable();
            lanches.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        return lanches;
    }

    private static class VerPrecoRenderer extends JButton implements TableCellRenderer {

        private static final long serialVersionUID = -3686680462801073538L;
        
        private VerPrecoRenderer() {
        }

        public static TableCellRenderer getInstanciaUnica() {
            return new VerPrecoRenderer();
        }

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            return new JButton("Ver preço");
        }
        
    }
    
    private static class VerPrecoListener extends MouseAdapter implements
            KeyListener {

        private JTable lanches;

        public VerPrecoListener(JTable lanches) {
            this.lanches = lanches;
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                exibaPrecoDoLancheSelecionado();
            }
        }

        private void exibaPrecoDoLancheSelecionado() {
            int linhaSelecionada = lanches.getSelectedRow();
            if (linhaSelecionada == -1) {
                return;
            }

            int colunaSelecionada = lanches.getSelectedColumn();
            if (colunaSelecionada == -1) {
                return;
            }

            Lanche lanche = (Lanche) lanches.getValueAt(linhaSelecionada,
                    colunaSelecionada);
            JOptionPane.showMessageDialog(null, "Lanche: " + lanche.descricao
                    + "\r\nPreço: " + lanche.preco);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            exibaPrecoDoLancheSelecionado();
        }

        @Override
        public void keyTyped(KeyEvent e) { }

        @Override
        public void keyReleased(KeyEvent e) {
        }

    }

    private static class Lanche {

        public String descricao;
        public BigDecimal preco;

        public Lanche(String descricao, double preco) {
            this.descricao = descricao;
            this.preco = BigDecimal.valueOf(preco);
        }

    }

    private static class LanchesDisponiveis extends AbstractTableModel {

        private static final long serialVersionUID = -8828829829157781777L;

        private static final Lanche[] LANCHES = new Lanche[] {
                new Lanche("X salada", 8.50), new Lanche("Hamburguer", 6.99),
                new Lanche("Mini pizza", 4.25) };

        @Override
        public int getRowCount() {
            return LANCHES.length;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Lanche lanche = LANCHES[rowIndex];
            return columnIndex == 0 ? lanche.descricao : lanche;
        }
        
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return getValueAt(0, columnIndex).getClass();
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }

    }

}