Incluir componente em uma única célula do JTable

7 respostas
L

Olá pessoal!

Estou criando uma aplicação que faz uma busca no banco de dados, retorna dois vetores, um de colunas outro de dados.
Uso o vetor de dados para construir minha JTable, e estou utilizando o AbstractTableModel.
Antes de construir a tabela eu crio um vetor de dados onde os títulos das colunas ficam na minha primeira coluna, e os dados seguem ao lado nas demais colunas. Transformo a tabela em uma tabela vertical. E também existe a opção de dividir a exibição em mais colunas, mas isso não é importante aqui.

O acontece é que por esta razão eu preciso de um jeito para inserir um componente em apenas 1 célula, e não definir a coluna toda com um tipo apenas. Alguém poderia me ajudar com isso? Já procurei muiiito e num encontrei como fazer.

Valeu!

7 Respostas

L

up

Pessoal, me ajudem, ninguém sabe como fazer isso mesmo?

preciso inserir um componente em apenas 1 célula da JTable, sem que a a coluna toda fique com os componentes.

Ironlynx

Não “UPE” tópicos! :x
Já pesquisou por TableCellRenderer aqui mesmo no fórum?

L

Já pesquisei tudo que vc possa imaginar…rs

Estou usando o TableCellRenderer para outros fins, mas para isso em específico não me parece possível.
Isso porque minha JTable é editável, então por mais que eu crie algum Componente pelo renderer e utilize isso somente para um célula, ainda não funciona corretamente. Isso funcionaria se eu conseguisse utilizar o CellEditor apenas em uma célula, mas somente consigo aplicar ele a uma coluna. Tentei criar um CellEditor alternando o Componente dele dependendo das condições mas também não consegui.

Alguma luz?? rs

Ironlynx

Vc está sobescrevendo o método isCellEditable para controlar o que é editável?
Por exemplo:

public boolean isCellEditable(int row, int col){ if(col == 1 || col == 4)return false;//se for a segund ou quinta coluna, deixa de ser editável else return true;//TODO resto é editável }

L

Sim, eu estou fazendo isso. Pois minha primeira coluna e algumas outras não são editáveis.
Mas ainda não entendi o que isso tem a ver com o meu problema.

Ironlynx

Erm… absolutamente, nada! :lol:
Li com calma o que vc escreveu, vc quer é poder inserir diferentes tipos de dados em células de uma mesma coluna da JTable, certo?
Vc pode estender a própria JTable, modificando o getCellEditor e ir controlando(via alguns if´s mesmo) o que será retornado no DefaultCellEditor, ou usar o conceito de MultiRenderer apresentado nesse tópico abaixo:
http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2006-12/msg00029.html

L

Olá, consegui algo mais próximo do que quero, vou postar o código aqui.

De qualquer maneira tenho dois problemas:
1 - Não queria ter que utilizar JTextFields na JTable, queria saber um meio de deixar as células como células normais, sem atribuir componentes à elas.
2 - Se não resolver o problema 1 vou precisar saber como fazer na JTable para que quando eu clicar nos JTextFields os dados não desapareçam, como se tivesse limpado o campo todo.

Segue o código, se alguém tiver algum sugestão me diga por favor:

class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
	DefaultCellEditor[][] cellEditors;
	int row;
	int column;
	int rows;
	int columns;
	
	public MyTableCellEditor(int rows, int columns) {
		this.cellEditors = new DefaultCellEditor[rows][columns];
		this.rows = rows;
		this.columns = columns;
	}
	

	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {
		
		for ( int setRow = 0; setRow < rows; setRow++ ) {
			for ( int setColumn = 0; setColumn < columns; setColumn++ ) {
				if ( setColumn == 4 ) {
					cellEditors[setRow][setColumn] = new DefaultCellEditor(new JComboBox());
				} else if (value instanceof Boolean) {
					cellEditors[setRow][setColumn] = new DefaultCellEditor(new JCheckBox());
				} else {
					String k;
					try {
						k = (String) value;
					} catch (Exception ex) {
						Integer in = (Integer) value;
						k = Integer.toString(in);
					}
					JTextField TF = new JTextField(k);
					TF.setText(k);
					cellEditors[setRow][setColumn] = new DefaultCellEditor(TF);
				}
			}
		}

		this.row = row;
		this.column = column;

		return cellEditors[row][column].getTableCellEditorComponent(table, "",
		          isSelected, row, column);
		
	}

	public Object getCellEditorValue() {
		if ( cellEditors[row][column].getComponent() instanceof JComboBox ){
			JComboBox c = (JComboBox)cellEditors[row][column].getComponent();
			return c.getSelectedItem();
		} else if ( cellEditors[row][column].getComponent() instanceof JCheckBox ){
			JCheckBox c = (JCheckBox)cellEditors[row][column].getComponent();
			return c.isSelected();
		} else {
		JTextField c = (JTextField)cellEditors[row][column].getComponent();
		return c.getText();
		}
	}
	
}

Valeu!!!

Criado 9 de março de 2011
Ultima resposta 14 de mar. de 2011
Respostas 7
Participantes 2