JComboBox em JTable

3 respostas
O

Bom dia! Estou tentando desenvolver um aplicativo que identifica os atributos de uma tabela de um banco de dados e os apresente em uma tabela. O usuário então indica se o atributo é Chave primária ou chave estrangeira através de 2 JCheckbox. Se o Usuário marcar o CheckBox correspondente a Chave estrangeira, a coluna ao lado é abilitada com um JComboBox contendo o nome das tabelas do banco. Quando o usuário seleciona um item do JComboBox, a coluna ao lado é ativada com outro JComboBox, os valores desse JComboBox dependem do item escolhido no JComboBox anterior.
[img]http://img23.imageshack.us/img23/1734/figurab.png[/img]

O meu problema é não consigo implementar os JComboBox...

Já criei meu TableModel, mas não sei como gerenciar os dados do JComboBox no modelo... Uso um ArrayList de Strings? ou ArrayList de JComboBox diretamente?

Também criei um CellRenderer... mas não ajudou muito....

Alguem poderia me indicar os passos que devo seguir para conseguir fazer isso?

Vou postar meu modelo aqui:

import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Otavio
 */
public class ModeloTabela extends AbstractTableModel {

    ArrayList<Object> coluna1 = new ArrayList();
    ArrayList<Object> coluna2 = new ArrayList();
    ArrayList<Object> coluna3 = new ArrayList();
    ArrayList<JComboBox> coluna4 = new ArrayList();
    ArrayList<JComboBox> coluna5 = new ArrayList();
   // ArrayList<String []> coluna4 = new ArrayList();
   // ArrayList<String []> coluna5 = new ArrayList();
    String [] headers =new String[5];
    
    public ModeloTabela()
    {
        headers[0]="Atributo";
        headers[1]="PK";
        headers[2]="FK";
        headers[3]="Tabela Referenciada";
        headers[4]="Atributo Referenciado";
    }
    
    
    public void shrink(int size) // diminui tabela até ela ficar do tamanho de size
            //se size for zero, então a tabela é totalmente apagada
    {
      while(coluna1.size() > size)
      {
          coluna1.remove(coluna1.size() - 1);
          coluna2.remove(coluna2.size() - 1);
          coluna3.remove(coluna3.size() - 1);
          coluna4.remove(coluna4.size() - 1);
          coluna5.remove(coluna5.size() -1 );

      }
      
      fireTableDataChanged();//atualiza tabela// recarrega tabela
    }
    
    public String getRefTable(int row) // retorna String selecionada no JComboBox RefTable
    {
        if(row<=coluna1.size() && row >=0)
        {
             return coluna4.get(row).getSelectedItem().toString();
        }
        return null;
    }
    
    public String getRefAtribute(int row) // retorna String selecionada no JComboBox RefAtribute
    {
        if(row<=coluna1.size() && row >=0)
        {
             return coluna5.get(row).getSelectedItem().toString();
        }
        return null;
    }
    
    public void adicionarComboBox_RefTable(Object [] x, int row) // adiciona vetor de strings no combobox RefTable da linha row
    {
         if(row<=coluna1.size() && row >=0)
        {
             coluna4.get(row).addItem(x);
             
        }
    }
    
    public void adicionarComboBox_RefAtribute(Object [] x, int row) // adiciona vetor de strings no combobox RefAtribute da linha row
    {
         if(row<=coluna1.size() && row >=0)
        {
             coluna5.get(row).addItem(x);
             
        }
    }
    
    @Override
    public int getRowCount() {
        return coluna1.size();
    }

    @Override
    public int getColumnCount() {
        return 5;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {//verificar se tem erro
       if (columnIndex >= 5 || rowIndex > coluna1.size() || columnIndex <0 || rowIndex<0)
            return null;
        else
        {
            if (columnIndex == 0)
                return coluna1.get(rowIndex);
            if (columnIndex == 1)
                return coluna2.get(rowIndex);
            if (columnIndex == 2)
                return coluna3.get(rowIndex);
            if (columnIndex == 3)
                return coluna4.get(rowIndex).getSelectedObjects();////O que fazer aqui??/
            else 
                return coluna5.get(rowIndex).getSelectedObjects();////O que fazer aqui??
        }
    } 
    
    
    @Override
    public void setValueAt(Object value, int row, int column)  // arrumar para ComboBox
     {
        if(column == 1 || column ==2)
        {
            if(column == 1)
                if (coluna2.get(row) == true)
                    coluna2.set(row, false);
                else
                    coluna2.set(row, true);
            
            if(column == 2)
                if (coluna3.get(row) == true)
                    coluna3.set(row, false);
                else
                    coluna3.set(row, true);
            fireTableDataChanged();
        }

        else if(column != 0)
        {
            fireTableCellUpdated(row, column);
        }
        
     }
    
    public void addRow(Object o)
    {
       coluna1.add(o); 
       coluna2.add(false);//checkbox como false
       coluna3.add(false);
       Object [] s = {"str","ss","ssss"};
       coluna4.add(new JComboBox(s));
       coluna5.add(new JComboBox(s));
       fireTableDataChanged(); //redesenha tabela
    }
    
    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        if (columnIndex == 1 || columnIndex == 2)
            return Boolean.class;
        if (columnIndex == 0)
            return String.class;
        else
            return JComboBox.class;
    }
    
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        if (columnIndex == 1 || columnIndex ==2 || columnIndex == 3 || columnIndex == 4)
            return true;
        else
            return false;
    }
    
     @Override
    public String getColumnName(int columnIndex)
    {
        return headers[columnIndex];
    }
    
    public boolean isEmpty() // retorna true se model estiver vazio
    {
        if(coluna1.size() == 0)
            return true;
        return false;
    }
    
}

Também estou postando meu CellRenderer:

import java.awt.Component;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Otavio
 */
public class ComboRenderer extends JComboBox implements TableCellRenderer
{

    public ComboRenderer()
    {
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setSelectedItem(value);
        return this;
    }
    
}

3 Respostas

O

Alguem? :cry:

O

Consegui avançar um pouco graças a um tópico que achei aqui no forum.

Meu problema agora é que na coluna n°5 eu preciso preencher os JComboBox de cada Cell individualmente dependendo do valor que for escolhido no JComboBox da coluna nº4, alguem tem alguma ideia de como fazer isso?

[img]http://img138.imageshack.us/img138/9088/figura2tg.png[/img]

Crio a tabela:
filaTabelas = banco.getAllTables(banco.getSchema()); // preenche filaTabelas com nome das tabelas
        ///INSERE TABELA
        modelo = new ModeloTabela();
        tabela = new JTable();
        tabela.setModel(modelo);
        jScrollPane1.setViewportView(tabela); // adiciona tabela
      
        Object [] t = banco.getAllTables(banco.getSchema()).toArray();
        TableColumn column3 = tabela.getColumnModel().getColumn(3); // isso faz o ComboBox funcionar
        column3.setCellRenderer(new ComboRenderer(t));
        
        column3.setCellEditor(new MyCellEditor(t));
        
        TableColumn column4 = tabela.getColumnModel().getColumn(4);// isso faz o ComboBox funcionar
        column4.setCellRenderer(new ComboRenderer(t));

        column4.setCellEditor(new MyCellEditor(t));
      
        executar();
Vou adicionando linhas na JTable
public void executar()
    {
        modelo.CleanModel();//limpa tabela
        if(!filaTabelas.isEmpty())
        {
            //se tiver tabelas na fila, preenche JTable com atributos
            jLabel1.setText(filaTabelas.get(0));
            ArrayList<String> atributos = banco.getNomeAtributos(filaTabelas.remove(0));
            
            while(!atributos.isEmpty())
            {
                Object [] ob = {atributos.get(0),false,false,"",""};
                atributos.remove(0);
                modelo.addRow(ob);
            }
        }

    }
MyCellEditor:
public class MyCellEditor extends AbstractCellEditor implements TableCellEditor
{

    ArrayList<Object> array = new ArrayList();
    JComboBox box = new JComboBox();
    
    public MyCellEditor(ArrayList<Object> lista)
    {
        array = lista;
        for(int i=0;i<array.size();i++)
        {
            box.addItem(array.get(i));
        }
    }
    
    public MyCellEditor(Object [] o)
    {
        for(int i=0;i<o.length;i++)
            box.addItem(o[i]);
    }
    
    @Override
    public Object getCellEditorValue() {
        return box.getSelectedItem();
    }

    @Override
    public Component getTableCellEditorComponent(JTable jtable, Object o, boolean bln, int i, int i1) {
        box.setSelectedItem(o); //deixa o editor pre-selecionado com o valor da célula
        
        return box;
    }
    
}

CellRenderer:

public class ComboRenderer extends JComboBox implements TableCellRenderer
{

    public ComboRenderer(Object [] b)
    {
        int i = b.length;
        i--;
        while(i>=0)
        {
            this.addItem(b[i]);
            i--;
        }
        
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setSelectedItem(value);
        return this;
    }
    
}

Meu TableModel:

public class ModeloTabela extends AbstractTableModel {

    String [] headers =new String[5];
    ArrayList<Object []> colunas = new ArrayList();
    
    public ModeloTabela()
    {
        headers[0]="Atributo";
        headers[1]="PK";
        headers[2]="FK";
        headers[3]="Tabela Referenciada";
        headers[4]="Atributo Referenciado";
    }
    
    
    public void shrink(int size) // diminui tabela até ela ficar do tamanho de size
            //se size for zero, então a tabela é totalmente apagada
    {
    
       while(colunas.size()>size)
       {
           colunas.remove(colunas.size()-1);
       }
       
      fireTableDataChanged();//atualiza tabela// recarrega tabela
    }
    
   
    @Override
    public int getRowCount() {
        return colunas.size();
    }

    @Override
    public int getColumnCount() {
        return 5;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {//verificar se tem erro
        if(columnIndex >= 5 || rowIndex >colunas.size() || columnIndex <0 || rowIndex <0)
            return null;
        else
        {
            Object [] linha = colunas.get(rowIndex);
            return linha[columnIndex];
        }
    } 
    
    
    @Override
    public void setValueAt(Object value, int row, int column)  // arrumar para ComboBox
     {  
        if(column == 1 || column ==2)
        {
            Object [] linhas = colunas.get(row);
            if(column == 1)
                if (linhas[column] == true)
                    linhas[column] = false;
                else
                   linhas[column] = true;
            
            if(column == 2)
                if (linhas[column] == true)
                    linhas[column] = false;
                else
                    linhas[column] = true;
            fireTableDataChanged();
        }

        else if(column == 3 || column == 4)
        {
            Object [] linhas = colunas.get(row);
            if(column ==3)
            {
                linhas[column] = value;
            }
            
            else
                 linhas[column] = value;
            fireTableDataChanged();
        }
        
     }
    
    public void addRow(Object [] o)
    {
        colunas.add(o);
       // int linha = colunas.size()-1;    
        fireTableDataChanged();//???
    }
    
    public void CleanModel()
    {
      shrink(0);
    }
    
    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        if (columnIndex == 1 || columnIndex == 2)
            return Boolean.class;
        if (columnIndex == 0)
            return String.class;
        else
            return JComboBox.class;
    }
    
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        if (columnIndex == 1 || columnIndex ==2 || columnIndex == 3 || columnIndex == 4)
            return true;
        else
            return false;
    }
    
     @Override
    public String getColumnName(int columnIndex)
    {
        return headers[columnIndex];
    }
    
    public boolean isEmpty() // retorna true se model estiver vazio
    {
        if(colunas.size() == 0)
            return true;
        return false;
    }
    
}
ErickRAR

Dê uma olhada aqui: http://www.guj.com.br/java/227702-preencher-jcombobox-atraves-de-outro-jcombobox-resolvido

Se não te ajudar, procure aqui no fórum por jVomboBox - Estado - Cidade. Parece ser a mesma coisa que você quer.

Criado 26 de julho de 2012
Ultima resposta 28 de jul. de 2012
Respostas 3
Participantes 2