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.
criador
Essa foi a classe que criei…
privateclassButtonColumnextendsAbstractCellEditorimplementsTableCellRenderer,TableCellEditor,ActionListener{/** * Define as variáveis de trabalho. */VeSTableio_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>) */publicButtonColumn(VeSTableao_table,intan_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=newVeSButton(null);io_bt_remover=newVeSButton(null);io_bt_remover.setFocusPainted(false);io_bt_remover.addActionListener(this);//// Modela a tabela.//TableColumnModelio_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 */publicComponentgetTableCellRendererComponent(JTableao_table,Objectao_value,booleanisSelected,booleanhasFocus,intln_row,intln_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...//elseif(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"));}returnio_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 */publicComponentgetTableCellEditorComponent(JTableao_table,Objectao_value,booleanisSelected,intln_row,intln_column){returnio_bt_remover;}publicObjectgetCellEditorValue(){return"";}publicvoidactionPerformed(ActionEvente){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.
davidtiagoconceicao
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í!
criador
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!
davidtiagoconceicao
HahHa, beleza!
Pesquise sobre os padrões Factory e Builder, eles podem ser úteis no seu caso.