Formas de inserir botões em uma tabela

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.

Alguém pode me ajudar!!!

Alguma ajuda?

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.

Essa foi a classe que criei…

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!

HahHa, beleza!
Pesquise sobre os padrões Factory e Builder, eles podem ser úteis no seu caso.