当前位置:编程学习 > JAVA >>

为什么执行了删除后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()也没用
急等大神解决啊. --------------------编程问答--------------------
引用 4 楼 huangxiaoya1993 的回复:
请问nicholasbobo
那我现在应该怎样让它实现客户端的table也同步显示呢? 
貌似updateUI()也没用
急等大神解决啊.

如果是未分页的表格,直接把表格中已删除的数据对应的行删除,再调用表格的updateUI()方法就可以了,如果是分页的表格,那么你需要重新查询数据库数据,再重新给表格加载数据,然后调用updateUI()方法 --------------------编程问答-------------------- 你从JTable中删除一条记录以后,你有没有调用fire TableModelChange事件
该事件会自动刷新JTable UI。
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,