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