JComboBox dentro de JTable

26 respostas
Diana

O codigo abaixo eh para fazer com que a edicao da coluna 3 em uma jtable seja atraves de um combobox…mas toda vez que tento editar a celula dah erro…
Alguem pode me ajudar?

private javax.swing.JTable getJTable() {
		if(jTable == null) {
		
		jTable = new javax.swing.JTable(modelo);
		jTable.setName("tableTelefone");
		JComboBox comboFone = new JComboBox(tipoFone);
		jTable.getColumn(jTable.getColumnName(3)).setCellEditor(new javax.swing.DefaultCellEditor(comboFone));
		}
		return jTable;
	}

Estou usando o Eclipse+VEP

Toda vez que eu clico na coluna onde supostamente ele teria o combo, eh disparado este stack

Thread [AWT-EventQueue-0] (Suspended (exception ArrayIndexOutOfBoundsException))
	EventDispatchThread.run() line: not available [local variables unavailable]

Obrigada,
[]'s

26 Respostas

L

tente o seguinte

TableColumn categor = jTable.getColumnModel().getColumn(3); JComboBox jCombBox = new JComboBox(); categor.setCellEditor(new DefaultCellEditor(jCombBox));

Diana

Continua dando o mesmo erro…
soh para ficar mais claro…tenho uma classe que eh a TableModel e quando crio a tabela passo o modelo para o construtor…

danieldestro

Qual o tipo dos dados do Model para onde será exibido o Combo?

Vector? List? array? Object???

Diana

As linhas sao ArrayList e as colunas sao String[]…

brlima

vc nao tem o trace da exception pra ajudar um pouco ?

Diana

Toda vez que eu clico ele dispara esse Stack…mas no Console mesmo…nada…como se estivesse tudo OK.

Thread [AWT-EventQueue-0] (Suspended (exception ArrayIndexOutOfBoundsException)) 
   EventDispatchThread.run() line: not available [local variables unavailable]
brlima

ja tentou ver se vc consegue editar num textfield comum ?
ja verificou se a coluna que vc ta setando o deitor realmente existe ?

a sua jtable ta setada pra criiar as coluans a partir do modelo?

Diana

Eu crio o Modelo, passo as colunas e linhas e quando crio a tabela passo o modelo como argumento…

danieldestro

O que vc retorna no model quando pedem pela coluna do combo?

Diana

retorno uma String…

brlima

Funciona se vc altera essa parte do codigo, tipo, coloca um JTextField ao inves da combo???

jTable.getColumn(jTable.getColumnName(3)).setCellEditor(new javax.swing.DefaultCellEditor(new JTextField()));

danieldestro

Talvez o erro esteja aí, não sei…
vc nao deveria retornar o List?

brlima

“danieldestro”:
Talvez o erro esteja aí, não sei…
vc nao deveria retornar o List?

Nao, porque ele trabalha com o valor selecionado. A combo serve nesse caso pra deixar o cara amarrado a escolher somente um valor da lista pra colocar na celula. :wink:

danieldestro

Então o erro deve estar no SET deve valor, no model dela… procede?

Diana

Nao deu…vou te passar o modelo…

public class TMTelefone extends AbstractTableModel{

	private ArrayList linhas = null;
	private String [] colunas;
	private boolean [] colsEdicao;
				
	/**
	 * Contrutor para a classe, recebendo os dados a serem exibidos
	 * e as colunas que devem ser criadas.
	 * @param dados
	 * @param colunas
	 */
	public TMTelefone(ArrayList dados, String[] colunas, boolean [] edicao){
		setLinhas(dados);
		setColunas(colunas);
		colsEdicao = edicao;
	}

	/**
	 * Retorna o numero de colunas no modelo
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public int getColumnCount() {return getColunas().length;}

	/**
	 * Retorna o numero de linhas existentes no modelo
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public int getRowCount() {return getLinhas().size();}

	/**
	 * Obtem o valor na linha e coluna
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	public Object getValueAt(int rowIndex, int columnIndex) {
		// Obtem a linha, que é uma String []
		String [] linha = (String [])getLinhas().get(rowIndex);
		// Retorna o objeto que esta na coluna
		return linha[columnIndex];
	}

	public String[] getColunas() {return colunas;}
	public ArrayList getLinhas() {return linhas;}
	public void setColunas(String[] strings) {colunas = strings;}
	public void setLinhas(ArrayList list) {linhas = list;}
	
	/**
	 * Seta o valor na linha e coluna
	 * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
	 */
	public void setValueAt(Object value, int row, int col){
		// Obtem a linha, que é uma String []
		String [] linha = (String [])getLinhas().get(row);
		// Altera o conteudo no indice da coluna passado
		linha[col] = (String)value;
		// dispara o evento de celula alterada
		fireTableCellUpdated(row,col);
	}
	/**
	 * Retorna se a celula pode ser editada
	 * @see javax.swing.table.TableModel#isCellEditable(int, int)
	 */
	public boolean isCellEditable(int row, int col){
		return colsEdicao[col];
	}
	
	/**
	 * Adiciona o array na linha
	 */
	public void addRow( String [] dadosLinha){
		getLinhas().add(dadosLinha);
		// Informa a jtable de que houve linhas incluidas no modelo
		// COmo adicionamos no final, pegamos o tamanho total do modelo
		// menos 1 para obter a linha incluida.
		int linha = getLinhas().size()-1;
		fireTableRowsInserted(linha,linha);
		return;
	}
	
	/**
	 * Remove a linha pelo indice informado
	 * @param row
	 */
	public void removeRow(int row){
		getLinhas().remove(row);
		// informa a jtable que houve dados deletados passando a 
		// linha removida
		fireTableRowsDeleted(row,row);
	}
		
	/**
	 * Remove a linha pelo valor da coluna informada
	 * @param val
	 * @param col
	 * @return
	 */
	public boolean removeRow(String val, int col){
		// obtem o iterator
		Iterator i = getLinhas().iterator();
		int linha = 0;
		// Faz um looping em cima das linhas
		while(i.hasNext()){
			// Obtem as colunas da linha atual
			String[] linhaCorrente = (String[])i.next();
			linha++;
			// compara o conteudo String da linha atual na coluna desejada
			// com o valor informado
			if( linhaCorrente[col].equals(val) ){
				getLinhas().remove(linha);
				// informa a jtable que houve dados deletados passando a 
				// linha removida
				fireTableRowsDeleted(linha,linha);
				return true;				
			}
		}
		// Nao encontrou nada
		return false;
	}
	
	/**
	 * Retorna o nome da coluna.
	 * @see javax.swing.table.TableModel#getColumnName(int)
	 */
	public String getColumnName(int col){
		return getColunas()[col];
	}
}
brlima

90% das chances… por isso pedi pra deixar o editor como textfield… se nao funcionar, entoa o erro ta no modelo mesmo, mas se funcionar, tem algo de bizzarro. :smiley: Ai o erro ta na combo dela… ou entao a coluna num tá criada :?

danieldestro

Diana, faz o teste e fala pra gente.

brlima

Diana, o modelo ta certinho, fiz o teste e tah legal( parece que ta ).
Testei tudo aqui e ta redondo. Ser que não é na contruçao do seu modelo, tipo, os parametros que vc ta passando ? O unico teste aqui q pode acontecer isso é:

  • Vc passar mais colunas declaredas do que realmente existe no array ( nem controi a tela )
  • Vc passar o numero de colunas menor que o de dados. Ai a coluna nao vai parar na Jtable. [editado](nesse caso, nem abre o programa, mas no outr sim, só nao aparece a jtable)[/editado]
Diana

Os argumentos que eu passei para criar o modelo foram estes…

ArrayList dados = new ArrayList();
String[] colunas = new String[] {"DDI","DDD","Fone","Tipo"};
boolean [] edicao = {true,false};
TMTelefone modelo=new TMTelefone(dados,colunas,edicao);

Como vc setou e quais argumentos vc passou para criar o modelo?

danieldestro

O erro está aqui:

boolean [] edicao = {true,false};

o número de booleans deve ser o mesmo do número de colunas

brlima

“danieldestro”:
O erro está aqui:

boolean [] edicao = {true,false};

o número de booleans deve ser o mesmo do número de colunas

Correto!!! :smiley:

Diana

poooooxa…sabe quando tu acha que o erro jamais pode ser o ponto-e-virgula faltando…pq tu sabe que ele deveria estar lah, e sendo assim tu tem certeza que colocou, mas olhando com atencao ele nao estah lah…
Que F###…

Obrigada por toda ajuda Galera!!!
Fico devendo!

danieldestro

Diana, vc parece a Luci Liu?

brlima

“Diana”:
poooooxa…sabe quando tu acha que o erro jamais pode ser o ponto-e-virgula faltando…pq tu sabe que ele deveria estar lah, e sendo assim tu tem certeza que colocou, mas olhando com atencao ele nao estah lah…
Que F###…

Obrigada por toda ajuda Galera!!!
Fico devendo!

é… se fosse uma tartaruga, te mordia…rssssss… :lol: Mas acontece… hehehehe

Diana

:slight_smile: , naum…mas achei a foto show…vc viu Kill Bill???
Essa sou eu:

danieldestro

Ainda não ví K.B.

Criado 19 de agosto de 2004
Ultima resposta 19 de ago. de 2004
Respostas 26
Participantes 4