Bom dia a todos.
Quais as formas (códigos) mais corretas para inserir um botão em uma determinada coluna de uma tabela ?
Já tenho isso implementado, porém fiz de uma forma muito genérica, sendo que os dois botões passam pela mesma inner class para serem inseridos e a ação que é determinada para um botão, é a mesma para o outro botão.
Sendo assim, tudo que um botão faz, o outro faz praticamente igual.
Tem uma forma simples de inserir um botão em uma tabela ?
Sei lá, apenas dizer a coluna e inserir este botão na coluna.
Por exemplo:
tabela.setValueAt(botao, 0, 3);
Já tentei desta forma mas ele não insere na tabela.
Você adiciona os botões no CellRenderer da JTable, certo?
Não conheço outra forma de adicionar botões a JTable se não através do CellRenderer.
O setValueAt serve para mudar a informação listada na célula, não o componente exibido.
Uma sugestão seria criar um construtor de botões, com métodos que criam botões para o Renderer.
Pesquise sobre os padrões Factory e Builder, quem sabe possa te ajudar.
private class ButtonColumn
extends AbstractCellEditor
implements TableCellRenderer,
TableCellEditor,
ActionListener
{
/**
* Define as variáveis de trabalho.
*/
VeSTable
io_table;
/**
Construtor que recebe a tabela e a coluna para a
inserção dos botões na mesma.
@param ao_table<br>
Tabela no qual será inserido o botão.<br><br>
@param an_column<br>
Coluna na qual será inserido o botão.
@see ButtonColumn<br>(<p style="margin-left: 30">VeSTable ao_table<br>int an_column<p>)
*/
public ButtonColumn
(
VeSTable ao_table,
int an_column
)
{
//
// Chama o construtor da classe pai.
//
super();
//
// Recebe a instância da tabela.
//
io_table = ao_table;
/*
Cria os botões.
*/
io_bt_novo = new VeSButton(null);
io_bt_remover = new VeSButton(null);
io_bt_remover.setFocusPainted(false);
io_bt_remover.addActionListener(this);
//
// Modela a tabela.
//
TableColumnModel
io_model = ao_table.getColumnModel();
io_model.getColumn(an_column).setCellRenderer(this);
io_model.getColumn(an_column).setCellEditor(this);
}
/**
Método responsável por definir qual botão está
com o foco e qual foi selecionado.
@param ao_table
@param ao_value
@param isSelected
@param hasFocus
@param ln_row
@param ln_column
*/
public
Component getTableCellRendererComponent
(
JTable ao_table,
Object ao_value,
boolean isSelected,
boolean hasFocus,
int ln_row,
int ln_column
)
{
//
// Se o botão selecionado tem foco...
//
if (
hasFocus
)
{
//
// Pinta-o conforme a cor da tabela.
//
io_bt_novo.setForeground(ao_table.getForeground());
io_bt_novo.setBackground(UIManager.getColor("Button.background"));
io_bt_remover.setForeground(ao_table.getForeground());
io_bt_remover.setBackground(UIManager.getColor("Button.background"));
}
//
// Se o botão foi selecionado...
//
else if (
isSelected
)
{
//
// Pinta-o conforme a cor da tabela.
//
io_bt_novo.setForeground(ao_table.getSelectionForeground());
io_bt_novo.setBackground(ao_table.getSelectionBackground());
io_bt_remover.setForeground(ao_table.getSelectionForeground());
io_bt_remover.setBackground(ao_table.getSelectionBackground());
}
else
{
io_bt_novo.setForeground(ao_table.getForeground());
io_bt_novo.setBackground(UIManager.getColor("Button.background"));
io_bt_remover.setForeground(ao_table.getForeground());
io_bt_remover.setBackground(UIManager.getColor("Button.background"));
}
return io_bt_novo;
}
/**
Método responsável por definir qual botão está
com o foco e qual foi selecionado.
@param ao_table
@param ao_value
@param isSelected
@param ln_row
@param ln_column
*/
public
Component getTableCellEditorComponent
(
JTable ao_table,
Object ao_value,
boolean isSelected,
int ln_row,
int ln_column
)
{
return io_bt_remover;
}
public
Object getCellEditorValue()
{
return "";
}
public
void actionPerformed(ActionEvent e)
{
fireEditingStopped();
//
// Se for selecionado o botão 'Novo'...
//
if (
io_table.getSelectedColumn()
== IN_COLUMN_BUTTON_NEW
)
{
//
// Adiciona uma nova linha na tabela.
//
NovaLinhaAdicionar();
}
//
// Se for selecionado o botão 'Remover'...
//
else
{
//
// Remove a linha selecionada na tabela.
//
LinhaRemover();
}
}
}
Com isto funciona, mas fica meio cofuso para mexer nos botões dentro desta inner class.
Infelizmente ainda não pude analisar bem detalhadamente seu código, mas pelo que pude perceber você criou uma classe que implementa diversas interfaces e alguns papéis. A primeira sugestão seria dividir esta implementação em outras classes (podem ser private mesmo) e criar uma classe que sirva de interface (e gerencie as demais).
Você pode criar também uma outra classe apenas para tratar os eventos do botões. Esta classe poderia ter referências para a JTable, o TableMode, ou o que for mais conveniente.
A adição da classe aos listeners do botão poderia ocorrer no construtor do próprio botão, ou poderia ser feita por uma classe que gerenciasse isso. No caso da segunda opção, poderia ser criada uma “fábrica de botões” que iria instanciar o botão, adicionar o listener e efetuar alguma outra configuração conforme desejado. Neste caso, o código ficaria mais ou menos assim:
io_bt_novo = fabricaDeBotoes(table, model, tipoDeBotao /*ou qualquer outro parâmetro necessário*/);
Confuso né?! Também achei :lol:
Se quizer mais detalhes, poste sua dúvida aí!
Ok!
Não vou dizer que entendi completamente, mas já tive uma vasta idéia do que pensasse.
Vou estudar melhor isso que dissesse e ver se isto se encaixa no que eu preciso.
Mas acredito que irá ajudar bastante.
Valeu por enquanto.
Fica atento nesse tópico que qualquer dúvida posto aqui!
Abraço David!