Seguinte, quero que uma coluna de minha JTable seja uma comboBox… ok?
Mass, ou maior problema é o seguinte, para cada Linha da tabela, o conteudo desse combobox muda.
Ex: (Nome e uma coluna da Tabela normal(String) e CArros é a coluna que tem o combobox de conteudo as Strings em parenteses)
Tabela X
Nome Carros
Joao (Gol, Palio, Fusca)
Jose (Uno, Palio)
Maria (Gol, Ferrari, Monza)
Ai que ta meu problema, eu ate conseguir colcoar o COMBOBOX dentro da coluna da JTABLE, ams o conteudo dela, eh o mesmo para todas as linahs da tabela, e eu preciso de um conteudo que seja vbariavel… =/
/**
* each row TableCellEditor
*
*/
public class EachRowEditor implements TableCellEditor {
protected Hashtable<Integer, TableCellEditor> editors;
protected TableCellEditor editor, defaultEditor;
/**
* Constructs a EachRowEditor.
* create default editor
*
* @see TableCellEditor
* @see DefaultCellEditor
*/
public EachRowEditor() {
editors = new Hashtable<Integer, TableCellEditor>();
defaultEditor = new DefaultCellEditor(new JTextField());
}
/**
* @param row table row
* @param editor table cell editor
*/
public void add(int row, TableCellEditor editor) {
editors.put(new Integer(row),editor);
}
public void remove(int row) {
editors.remove(new Integer(row));
}
public void removeAll(){
editors.clear();
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
editor = (TableCellEditor)editors.get(new Integer(row));
if (editor == null) {
editor = defaultEditor;
}
return editor.getTableCellEditorComponent(table,
value, isSelected, row, column);
}
public Object getCellEditorValue() {
return editor.getCellEditorValue();
}
public boolean stopCellEditing() {
return editor.stopCellEditing();
}
public void cancelCellEditing() {
editor.cancelCellEditing();
}
public boolean isCellEditable(EventObject anEvent) {
if( editor == null ) return true;
return editor.isCellEditable(anEvent);
}
public void addCellEditorListener(CellEditorListener l) {
editor.addCellEditorListener(l);
}
public void removeCellEditorListener(CellEditorListener l) {
editor.removeCellEditorListener(l);
}
public boolean shouldSelectCell(EventObject anEvent) {
return editor.shouldSelectCell(anEvent);
}
}
Associo a instância da classe acima na coluna da JTable que quero tratar…
tableColumn.setCellEditor(_rowEditor);
Associo diferentes comboboxes com diferentes conteúdos à linha do model. A variável li_linha representa a linha da JTable.
DefaultComboBoxModel comboModel = new DefaultComboBoxModel(vetorQualquer);
JComboBox comboBox = new JComboBox();
comboBox.setModel(comboModel);
_rowEditor.add(li_linha, new DefaultCellEditor(comboBox) );
É desse jeito que eu faço, não sei se existe uma forma melhor…
Esse codigo eu deveria colocar em que situação? Estou quebrando a cabeca aqui mas nao consigo… Esse _rowEditor é uma instancia de EachRowEditor certo?
DefaultComboBoxModel comboModel = new DefaultComboBoxModel(vetorQualquer);
JComboBox comboBox = new JComboBox();
comboBox.setModel(comboModel);
_rowEditor.add(li_linha, new DefaultCellEditor(comboBox) );
E sobre o codigo da classe EachRowEditor fiquei meio perdido nela, mas eu me viro aqui e aprendo tudo sobre ela…
Sim, a _rowEditor é instância da EachRowEditor. A EachRowEditor você não muda nem codifica nada nela, usa ela desse jeito.
Supondo que você esteja carregando a lista de dados da sua JTable, dentro de um loop, o seu contador de linhas iria no lugar da li_linha.
Em uma outra situação, na JTable você tinha na linha 4 um valor na coluna A e quando ele é alterado, muda a combo da coluna B. Quando o valor da coluna A da linha 4 for alterado, você remove a dropdown da coluna B da linha 4 com os dados antigos ( _rowEditor.remove(4) ) e coloca a nova combo com a nova lista de dados.
Se eu não consegui me explicar direito ainda você, você pode procurar no Google por eachroweditor que eu copiei esta classe de um exemplo que achei na net e talvêz lá esteja melhor explicado.