为什么执行了删除后JTable不能刷新,repaint()怎么了?
package test.xml.www;import javax.sql.rowset.spi.XmlWriter;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import java.io.*;
import java.sql.*;
import java.text.Format;
public class Mainw extends JFrame implements ActionListener{
static JTable table;
Object a[][];
Object name[] = {"编号","商品名","价格","数量"};
JButton button1;
JButton button2;
JButton button3;
JButton button4;
JButton button5;
JButton button6;
JButton button7;
JLabel label;
Box basebox,box1,box2,box3;
Connection conn;
Statement sta;
ResultSet rs;
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=market"; //声明数据库的URL,用户名和密码,market为数据库名
String user="sa";
String password="sa";
Mainw() throws InstantiationException, IllegalAccessException{
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
}catch(ClassNotFoundException event){
System.out.println("加载驱动器类时出现异常1");
}
try{
conn=DriverManager.getConnection(url,user,password);
sta=conn.createStatement();
String sql="SELECT count(*) FROM market ";
rs =sta.executeQuery(sql);
rs.next();
int i = rs.getInt(1);
String sql1="SELECT * FROM market ";
rs =sta.executeQuery(sql1);
a=new Object[i][4];
button1 = new JButton("删除");
button2 = new JButton("刷新");
button3 = new JButton("退出");
button4 = new JButton("备份");
button5 = new JButton("还原此次修改前的数据");
button6 = new JButton("保存");
button7 = new JButton("添加");
table = new JTable(a,name);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
button6.addActionListener(this);
button7.addActionListener(this);
box1 = Box.createHorizontalBox();
box1.add(button7);
box1.add(Box.createHorizontalStrut(10));
box1.add(button1);
box1.add(Box.createHorizontalStrut(10));
box1.add(button6);
box1.add(Box.createHorizontalStrut(10));
box1.add(button2);
box2 = Box.createHorizontalBox();
box2.add(button5);
box2.add(Box.createHorizontalStrut(10));
box2.add(button4);
box2.add(Box.createHorizontalStrut(10));
box2.add(button3);
basebox = Box.createVerticalBox();
basebox.add(box1,BorderLayout.NORTH);
basebox.add(Box.createVerticalStrut(15));
basebox.add(box2,BorderLayout.SOUTH);
box3 = Box.createHorizontalBox();
box3.add(label = new JLabel("商品管理"),BorderLayout.CENTER);
Container con = getContentPane();
getContentPane().add(new JScrollPane(table),BorderLayout.CENTER);
con.add(label,BorderLayout.NORTH);
con.add(basebox,BorderLayout.SOUTH);
setSize(600,600);
setVisible(true);
validate();
setDefaultCloseOperation(EXIT_ON_CLOSE);
int m = 0;
while(rs.next()){
// for(int m = 0;m<i;m++){
a[m][0] = rs.getInt("编号");
a[m][1] =rs.getString("商品名");
a[m][2] = rs.getFloat("价格");
a[m][3] = rs.getInt("数量");
m++;
// }
}
conn.close();
// this.table.repaint();
// table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
// public void valueChanged(ListSelectionEvent e) {
//// int value;
//// String v = table.getValueAt(table.getSelectedRow(),0).toString();
//// value = Integer.parseInt(v);
//
// }
// });
// table.addMouseListener(new MouseAdapter() {
// public void mouseClicked(MouseEvent e) {
// //JTable sourceTable = (JTable)e.getSource();
// if(((JTable)e.getSource()).getRowCount() <= 0){
// return;
// }
// int rowIndex = ((JTable)e.getSource()).rowAtPoint(e.getPoint());
// DefaultTableModel tableModel = (DefaultTableModel)((JTable)e.getSource()).getModel();
// tableModel.removeRow(rowIndex);
// repaint();
// }
// });
}catch(SQLException e){
System.out.println(e);
} finally { System.out.println("Finally"); }
}
@Override
public void actionPerformed(ActionEvent e) { //实现接口中方法
if(e.getSource()==button1){ //删除
System.out.println("点击了button1");
int value;
String v = table.getValueAt(table.getSelectedRow(),0).toString();
value = Integer.parseInt(v);
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载数据库驱动程序
conn=DriverManager.getConnection(url,user,password); //获得数据库连接
sta=conn.createStatement();
sta.executeUpdate("delete from market where 编号 = "+"'"+value+"'"); //查询数据
System.out.println("数据库执行删除成功");
}catch(ClassNotFoundException event){
event.printStackTrace();
System.out.println("加载驱动器类时出现异常3");
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
System.out.println(22);
}
Mainw.table.repaint();
}
else if(e.getSource()==button2){ //刷新
table.repaint();
}
else if(e.getSource()==button3){ //退出
System.exit(0);
}
else if(e.getSource()==button4){ //导出数据成xml文件备份
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载数据库驱动程序
conn=DriverManager.getConnection(url,user,password); //获得数据库连接
sta=conn.createStatement();
String sql2="SELECT * FROM market ";
rs =sta.executeQuery(sql2); //查询数据,放入记录集中
if(rs!=null){ //如果有记录,调用writeXML方法,把记录集传给writeXML方法
writeXML(rs);
}
else{
System.out.println("数据库中没有数据!");
}
}catch(ClassNotFoundException event){
System.out.println("加载驱动器类时出现异常2");
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
else if(e.getSource()==button5){ //将xml文件数据导入数据库还原
String [][] market = new String[4][4];
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); //加载数据库驱动程序
conn=DriverManager.getConnection(url,user,password); //获得数据库连接
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
DocumentBuilder dombuilder = domfac.newDocumentBuilder();
Document document = dombuilder.parse(new File("goods.xml"));
NodeList 编号表 = document.getElementsByTagName("编号"); //通过节点名称获得编号节点数据并保存到一个二维数组中
for(int i = 0;i< 编号表.getLength();i++){
Node node = 编号表.item(i);
String 编号 = node.getTextContent().trim();
market[i][0] = 编号;
}
NodeList 商品名表 = document.getElementsByTagName("商品名"); //通过节点名称获得商品名节点数据并保存到一个二维数组中
for(int i = 0;i< 商品名表.getLength();i++){
Node node = 商品名表.item(i);
String 商品名 = node.getTextContent().trim();
market[i][1] = 商品名;
}
NodeList 价格表 = document.getElementsByTagName("价格"); //通过节点名称获得价格节点数据并保存到一个二维数组中
for(int i = 0;i< 价格表.getLength();i++){
Node node = 价格表.item(i);
String 价格 = node.getTextContent().trim();
market[i][2] = 价格;
}
NodeList 数量表 = document.getElementsByTagName("数量"); //通过节点名称获得商品名节点数据并保存到一个二维数组中
for(int i = 0;i< 数量表.getLength();i++){
Node node = 数量表.item(i);
String 数量 = node.getTextContent().trim();
market[i][3] = 数量;
}
PreparedStatement pst = conn.prepareStatement("insert into market values(?,?,?,?)"); //声明PreparedStatement语句
for(int i = 0;i<商品名表.getLength();i++){
pst.setInt(1, Integer.parseInt(market[i][0]));
pst.setString(2, market[i][1]);
pst.setFloat(3, Float.parseFloat(market[i][2]));
pst.setInt(4, Integer.parseInt(market[i][3]));
pst.executeUpdate();
}
}catch(Exception e3){
// e3.printStackTrace();
// sta=conn.createStatement();
// String sql="SELECT * FROM market ";
// rs =sta.executeQuery(sql);
// if(rs.next()){
// for(int i = 0;i< 编号表.getLength();i++)
// if(market[i][0].equals(rs.getInt("编号"))){
// System.out.println("该编号已存在!");
// }
// }
JOptionPane.showMessageDialog(this, "该编号已存在!","警告对话框",JOptionPane.WARNING_MESSAGE);
}
}
else if(e.getSource()==button6){ //保存
}
else if(e.getSource()==button7){ //添加
Addwin add = new Addwin();
table.repaint();
}
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
new Mainw();
}
}
--------------------编程问答-------------------- 控件不支持,以前遇到过这种情况 --------------------编程问答-------------------- 试试updateUI() --------------------编程问答-------------------- 粗略看了下你的代码,只看到数据库的数据被删除了,没看到客户端的TABLE数据有删除的地方,表格当然不会更新了,你调用repaint()方法,并不代表表格的数据会重新去数据库取值,还是会用以前查到的数据 --------------------编程问答-------------------- 请问nicholasbobo
那我现在应该怎样让它实现客户端的table也同步显示呢?
貌似updateUI()也没用
急等大神解决啊. --------------------编程问答--------------------
如果是未分页的表格,直接把表格中已删除的数据对应的行删除,再调用表格的updateUI()方法就可以了,如果是分页的表格,那么你需要重新查询数据库数据,再重新给表格加载数据,然后调用updateUI()方法 --------------------编程问答-------------------- 你从JTable中删除一条记录以后,你有没有调用fire TableModelChange事件
该事件会自动刷新JTable UI。
补充:Java , Java相关