JComboBox dentro de JTable

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

tente o seguinte

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

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…

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

Vector? List? array? Object???

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

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

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] 

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?

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

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

retorno uma String…

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()));

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

[quote=“danieldestro”]Talvez o erro esteja aí, não sei…
vc nao deveria retornar o List?[/quote]

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:

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

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];
	}
}

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 :?

Diana, faz o teste e fala pra gente.

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]

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?