Atualização de JTable em tempo de execução

Olá! 8O 8O

Estou fazendo um programinha que possui um JTable dentro de um ScrollPanel e quando uma linha é selecionada e o botão Incluir ou o botão atualizar é apertado é aberto um JFrame com os campos a serem preenchidos/alterardos. Quando eu clico no OK os dados dentro desse JFrame atualizam o banco de dados mas não atualizam o JTable. Vocês podem me informar como eu faço para atualizar o JTable com os dados
inseridos/atualizados?

O problema é que o JTable está em uma classe e o JFrame é outra classe. Para vocês entenderem melhor estou enviando os códigos das duas classes.Poderiam me ajudar a resolver esse problema?

[code]
===Essa Classe contêm o JTable e o ScrollPanel===
public class Medicamento2 extends JPanel implements ActionListener, ItemListener{
JTable table;
JScrollPane scrollPane;
JPanel p, p1, p2, p3;
JButton b1, b2, b3, b4, b5, b6;
//private JLabel diver;
String selCol;
private boolean DEBUG = false;
private boolean ALLOW_COLUMN_SELECTION = false;
private boolean ALLOW_ROW_SELECTION = true;
String data[][];
public Medicamento2(){

p = new JPanel();
p.setLayout(new BorderLayout());
p.setBackground(Color.red);

p3 = new JPanel();
p3.setBackground(Color.blue);
//b1 = new JButton("Limpar");
//b1.addActionListener(this);
//p3.add(b1);
b2 = new JButton("Incluir");
b2.addActionListener(this);
p3.add(b2);
b3 = new JButton("Alterar");
b3.addActionListener(this);
p3.add(b3);
b4 = new JButton("Excluir");
b4.addActionListener(this);
p3.add(b4);
b6 = new JButton("Encerrar");
b6.addActionListener(this);
p3.add(b6);

p.add(p3, "North");

try{
conexaoMDB conec = new conexaoMDB();
String sql = “select cod_remedio, desc_remedio, embalagem_remedio, dosagem_remedio, tipo_remedio, valor_vita, valor_pachecco, valor_farmalife from Tab_Remedio where tipo_remedio=‘R’”;
ResultSet rs = conec.setConexao(sql, “c”);
//System.out.println(rs);
rs.last();
int tam = rs.getRow();
//int tam = 20;
data = new String[tam][8];
int col=0;
int lin = 0;
rs.beforeFirst();

while (rs.next())
{

String cod_remedio = rs.getString(1);
String desc_remedio = rs.getString(2);
String dosagem_remedio = rs.getString(3);
String embalagem_remedio = rs.getString(4);
String tipo_remedio = rs.getString(5);
String valor_vita = rs.getString(6);
String valor_pachecco = rs.getString(7);
String valor_farmalife = rs.getString(8);

data[lin][0] = cod_remedio;
data[lin][1] = desc_remedio;
data[lin][2] = dosagem_remedio;
data[lin][3] = embalagem_remedio;
data[lin][4] = tipo_remedio;
data[lin][5] = valor_vita;
data[lin][6] = valor_pachecco;
data[lin][7] = valor_farmalife;

lin = ++lin;
//System.out.println("Variavel lin no Loop: " + lin);
} //Fim While
//System.out.println("Variavel lin fora do Loop: " + lin);
//stmt.close();
//con.close();

//System.out.println(data);
String[] columnNames = {"Código", "Remédio", "Dose", "Emb.", "Tipo", "Vita", "Pachecco", "Farmalife"};

table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 300));
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if (ALLOW_ROW_SELECTION){
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()){
System.out.println("Nenhuma linha foi selecionada");
} else {
int selectedRow = lsm.getMinSelectionIndex();
System.out.println("Linha " + selectedRow + "foi selecionada");
selCol = data[selectedRow][0];
System.out.println("valor = " + selCol);
}
}
});

} else {
table.setRowSelectionAllowed(false);
}
if (ALLOW_COLUMN_SELECTION) { // false by default
if (ALLOW_ROW_SELECTION) {
//We allow both row and column selection, which
//implies that we really want to allow individual
//cell selection.
table.setCellSelectionEnabled(true);
}
table.setColumnSelectionAllowed(true);
ListSelectionModel colSM = table.getColumnModel().getSelectionModel();
colSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;

ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
System.out.println("No columns are selected.");
} else {
int selectedCol = lsm.getMinSelectionIndex();
System.out.println("Column " + selectedCol

  • " is now selected.");
    }
    }
    });
    }

//System.out.println(table.getColumn(columnNames[0]));
if (DEBUG) {
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
printDebugData(table);
}
});
}

//Create the scroll pane and add the table to it.
scrollPane = new JScrollPane(table);

//Add the scroll pane to this window.
add(scrollPane, BorderLayout.CENTER);
p.add(scrollPane, "Center");
add(p);

}

catch (SQLException ex)
{
String qualErro;
qualErro = "Problemas no acesso ao banco de dados !\nAs mensagens retornadas são:"+
"\nSQLState: " + ex.getSQLState() +
"\nMensagem: " + ex.getMessage() +
"\nCódigo do erro: " + ex.getErrorCode();
System.out.println(qualErro);
}
catch (java.lang.Exception ex1)
{
String qualErro;
qualErro = "O driver JDBC:ODBC não foi encontrado !\nA mensagem de erro é:"+
"\nMensagem: " + ex1.getMessage();
System.out.println(qualErro);
System.out.println(ex1.fillInStackTrace());
}
}
private void printDebugData(JTable table) {
int numRows = table.getRowCount();
int numCols = table.getColumnCount();
javax.swing.table.TableModel model = table.getModel();

//System.out.println("Value of data: ");
for (int i=0; i < numRows; i++) {
//System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
//System.out.print(" " + model.getValueAt(i, j));
}
//System.out.println();
}
//System.out.println("--------------------------");
}
public void itemStateChanged(ItemEvent evt)
{
//int qual = list1.getSelectedIndex();
//atualizaTela(qual);
}
public void actionPerformed(ActionEvent evt)
{
String arg = evt.getActionCommand();

if (arg.equals("Incluir"))
incluir();
else
if (arg.equals("Alterar"))
alterar();
else

if (arg.equals("Excluir"))
excluir();

else
if (arg.equals("Encerrar"))
System.exit(0);

}
public void incluir(){
//System.out.println(table.);
montaTela tela = new montaTela("0", "i");
tela.setSize(780, 550);
//dl.setBackground(Color.white);
tela.setResizable(false);
tela.pack();
tela.show();
}
public void alterar(){
System.out.println("Alterar: selCol=" + selCol);
montaTela tela = new montaTela(selCol, "a");
tela.setSize(780, 550);
//dl.setBackground(Color.white);
tela.setResizable(false);
tela.pack();
tela.show();
}
public void excluir(){
System.out.println("Excluir");
}

}

===Essa Classe contem o JFrame que faz atualização====
public class montaTela extends JFrame implements ActionListener{
int codRemedio;
JPanel p, p1, p2, p3;
JButton bIncluir, bLimpar, bSair, bAlterar;
ButtonGroup g;
String codExt;
//String buttonName;
JTextField tNome, tDose, tEmbalagem, tPVita, tPPachecco, tPFarmalife;
JLabel lNome, lDose, lTipo, lEmbalagem, lPVita, lPPachecco, lPFarmalife;
JRadioButton buttonRe, buttonPe;
public montaTela(String cod, String op) {
//op é a operação (incluir, alterar)
//cod é o código do remédio que será alterado
codExt = cod;
if (op.equals("i")){
}
else if (op.equals("a")){
}
else{
System.out.println("Erro: Valor de operação inválido");
}

p = new JPanel();
p.setLayout(new BorderLayout());
p.setBackground(Color.darkGray);
p.setForeground(Color.black);
p.setBorder(BorderFactory.createBevelBorder(1));
p.setSize(300, 300);

p2 = new JPanel();
p2.setBackground(Color.pink);
p2.setForeground(Color.black);
p2.setLayout(new GridLayout(6,6));
lNome = new JLabel(" Nome do Remédio: ", Label.RIGHT);
lDose = new JLabel(" Dosagem: ", Label.RIGHT);
lEmbalagem = new JLabel(" Embalagem: ", Label.RIGHT);
lPVita = new JLabel(" Preço Vita: ", Label.RIGHT);
lPPachecco = new JLabel(" Preço Pachecco: ", Label.RIGHT);
lPFarmalife = new JLabel(" Preço Farmalife: ", Label.RIGHT);
tNome = new JTextField(10);
tDose = new JTextField(10);
tEmbalagem = new JTextField(5);
tPVita = new JTextField(5);
tPPachecco = new JTextField(5);
tPFarmalife = new JTextField(5);

p2.add(lNome); p2.add(tNome);p2.add(new JLabel());
p2.add(lDose); p2.add(tDose);p2.add(new JLabel());
p2.add(lEmbalagem); p2.add(tEmbalagem);p2.add(new JLabel());
p2.add(lPVita); p2.add(tPVita);p2.add(new JLabel());
p2.add(lPPachecco); p2.add(tPPachecco);p2.add(new JLabel());
p2.add(lPFarmalife); p2.add(tPFarmalife);p2.add(new JLabel());
p.add(p2, "North");

JPanel buttonPanel = new JPanel();
g = new ButtonGroup();
buttonRe = new JRadioButton("Remédio", true);
buttonPe = new JRadioButton("Perfumaria", true);
buttonRe.addActionListener(this);
buttonPe.addActionListener(this);

if (op.equals("i")){
tDose.setText("0");
tEmbalagem.setText("CX");
tPVita.setText("0");
tPPachecco.setText("0");
tPFarmalife.setText("0");
}
else if (op.equals("a")){
try{
conexaoMDB conec = new conexaoMDB();
String sql = "select cod_remedio, desc_remedio, embalagem_remedio, dosagem_remedio, tipo_remedio, valor_vita, valor_pachecco, valor_farmalife from Tab_Remedio where cod_remedio=" + codExt;
System.out.println(sql);

ResultSet rs = conec.setConexao(sql, "c");
while (rs.next())
{
tNome.setText(rs.getString(2));
tDose.setText(rs.getString(4));
tEmbalagem.setText(rs.getString(3));
tPVita.setText(rs.getString(6));
tPPachecco.setText(rs.getString(7));
tPFarmalife.setText(rs.getString(8);
if (op.equals("a")){
if (rs.getString(5).equals("R")){
buttonRe.setSelected(true);
buttonPe.setSelected(false);
}
else if (rs.getString(5).equals("P")){
buttonRe.setSelected(false);
buttonPe.setSelected(true);
}
//Trata perfumaria e remédios
}

}
}
catch (SQLException ex)
{
String qualErro;
qualErro = "Problemas no acesso ao banco de dados !\nAs mensagens retornadas são:"+
"\nSQLState: " + ex.getSQLState() +
"\nMensagem: " + ex.getMessage() +
"\nCódigo do erro: " + ex.getErrorCode();
System.out.println(qualErro);
}
catch (java.lang.Exception ex1)
{
String qualErro;
qualErro = "O driver JDBC:ODBC não foi encontrado !\nA mensagem de erro é:"+
"\nMensagem: " + ex1.getMessage();
System.out.println(qualErro);
System.out.println(ex1.fillInStackTrace());
}
}

g.add(buttonRe);
g.add(buttonPe);
buttonPanel.add(buttonRe);
buttonPanel.add(buttonPe);
p.add(buttonPanel, "Center");

p3 = new JPanel();
p3.setBackground(Color.blue);
p3.setForeground(Color.black);
if (op.equals("i")){
bLimpar = new JButton("Limpar");
bLimpar.addActionListener(this);
p3.add(bLimpar);
}

if (op.equals("i")){
bIncluir = new JButton("Incluir");
bIncluir.addActionListener(this);
p3.add(bIncluir);
}
else if (op.equals("a")){
bAlterar = new JButton("Alterar");
bAlterar.addActionListener(this);
p3.add(bAlterar);
}
bSair = new JButton("Sair");
bSair.addActionListener(this);
p3.add(bSair);
p.add(p3, "South");

getContentPane().add(p);

}
public void actionPerformed(ActionEvent evt){
String arg = evt.getActionCommand();
if (arg.equals("Limpar")){
//System.out.println("Limpar");
limpar();

}
else if (arg.equals("Incluir")){

incluirRP();
}
else if (arg.equals("Alterar")){

alterarRP();
}
else if (arg.equals("Sair")){

//System.exit(0);
this.hide();
}

}
public void limpar()
{
tNome.setText("");
tDose.setText("0");
tEmbalagem.setText("CX");
tPVita.setText("0");
tPPachecco.setText("0");
tPFarmalife.setText("0");
buttonRe.setSelected(true);
buttonPe.setSelected(false);
}
public void alterarRP(){
System.out.println("montaTela: Alterar");
System.out.println("cod=" + codExt);
conexaoMDB conec = new conexaoMDB();
String tipo = "";
String teste;

if (buttonRe.isSelected())
{
tipo = "R";
} else if (buttonPe.isSelected())
{
tipo = "P";
}
if (tNome.getText().equals("")){
JOptionPane.showMessageDialog(this,"Favor Preencher o campo Descrição","Erro",JOptionPane.ERROR_MESSAGE);
tNome.requestFocus();
//tNome.setText("");
//break;
}
if(tDose.getText().equals("")){
tDose.setText("0");
}
if(tEmbalagem.getText().equals("")){
JOptionPane.showMessageDialog(this,"Favor Preencher o campo Embalagem","Erro",JOptionPane.ERROR_MESSAGE);
tEmbalagem.requestFocus();
//tEmbalagem.setText("");
//break;
}
if(tPVita.getText().equals("")){
tPVita.setText("0");
}
if(tPPachecco.getText().equals("")){
tPPachecco.setText("0");
}
if(tPFarmalife.getText().equals("")){
tPFarmalife.setText("0");
}
if ((!tNome.getText().equals("")) && (!tEmbalagem.getText().equals(""))){

String sql = “UPDATE Tab_remedio set desc_remedio=’” + tNome.getText() + “’, " +
“dosagem_remedio=” + tDose.getText() + “, embalagem_remedio=’” + tEmbalagem.getText() + “’, " +
“tipo_remedio=’” + tipo + “’, valor_vita=” + tPVita.getText().replaceAll(”,”, “.”) + “, " +
“valor_pachecco=” + tPPachecco.getText().replaceAll(”,", “.”) + “, valor_farmalife=” + tPFarmalife.getText().replaceAll(",", “.”) + " " +
“where cod_remedio=” + codExt;

System.out.println(sql);

conec.setConexao(sql, "u");
}
Medicamento2 med = new Medicamento2();
med.table.revalidate();
med.table.repaint();
//med.repaint();
//med.updateUI();

}
public void incluirRP(){
conexaoMDB conec = new conexaoMDB();
String tipo = "";
String teste;

//System.out.println("Incluir");
if (buttonRe.isSelected())
{
tipo = "R";
} else if (buttonPe.isSelected())
{
tipo = "P";
}
if (tNome.getText().equals("")){
JOptionPane.showMessageDialog(this,"Favor Preencher o campo Descrição","Erro",JOptionPane.ERROR_MESSAGE);
tNome.requestFocus();
//tNome.setText("");
//break;
}
if(tDose.getText().equals("")){
tDose.setText("0");
}
if(tEmbalagem.getText().equals("")){
JOptionPane.showMessageDialog(this,"Favor Preencher o campo Embalagem","Erro",JOptionPane.ERROR_MESSAGE);
tEmbalagem.requestFocus();
//tEmbalagem.setText("");
//break;
}
if(tPVita.getText().equals("")){
tPVita.setText("0");
}
if(tPPachecco.getText().equals("")){
tPPachecco.setText("0");
}
if(tPFarmalife.getText().equals("")){
tPFarmalife.setText("0");
}
if ((!tNome.getText().equals("")) && (!tEmbalagem.getText().equals(""))){

String sql = "Insert into Tab_remedio (desc_remedio, "+
“dosagem_remedio, embalagem_remedio, tipo_remedio, valor_vita, “+
“valor_pachecco, valor_farmalife)”+
“values(’” + tNome.getText() + “’, " + tDose.getText() + “, '”+
tEmbalagem.getText() + “’, '” + tipo + “’, " + tPVita.getText().replaceAll(”,”, “.”)+
“, " + tPPachecco.getText().replaceAll(”,”, “.”) + “, " + tPFarmalife.getText().replaceAll(”,”, “.”) + “)”;

System.out.println(sql);

conec.setConexao(sql, "i");
}
Medicamento2 med = new Medicamento2();
med.table.revalidate();
med.table.repaint();

}
}[/code]

Grata,
Andrea

Vc pega o model da JTable, como o método getModel ai vc substitui na linha selecionada e é atualizada automaticamente a visão da JTable…, isso tb serve para remoção… blz?

JavaTeco,

Muito Obrigada por responder!!! :wink: :wink:

Eu sou iniciante e ainda estou tentando aprender alguns conceitos de Java. Estou apanhando muito pois não tenho ninguém para me orientar, somente 2 livros. Minha experiência é em ASP, PHP e VB!

Como eu faço para dar esse getModel? Em qual das classes? Para mim teria que ser na classe montaTela que é onde eu confirmo a atualização. Mas o JTable está na classe Medicamento2. Crio uma instância de Medicamento2 dentro de montaTela (como eu fiz)? O que esse getModel faz?

Estou tentando acessar a documentação da API da Sun mas a internet aqui no trabalho está uma porcaria… estão travando todos os sites!! Imagine trabalhar em desenvolvimento sem internet, pode?

Grata,
Andrea

Outra maneira de você resolver isto é extender sua classe que efetua as alterações no banco de dados da classe Observable e utilizar os métodos setChanged() e notifyObservers().
Daí na sua classe que exibe a tabela, você implementa a classe Observer e sobescreve o método update, movendo um vetor atualizado para sua TableModel e depois atualizando com o método updateUI().