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

3 respostas
A

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

} 
}

Grata,
Andrea

3 Respostas

J

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?

A

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

L

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

Criado 9 de julho de 2004
Ultima resposta 9 de jul. de 2004
Respostas 3
Participantes 3