这个例子已经可以从数据库(时时更新的数据库)里面读数据,并按照表的形式显示,但表怎么才能时时的刷新呢?我加了一个Thread 从新new 这个table.好象我做的不对!
网站上我看有人说用,table.repaint();
有些人说用AbstractTableModel model = (AbstractTableModel) table.getModel();
model.fireTableDataChanged();
哪个位仁兄能把我这个程序转换成MyTableModel extends AbstractTableModel的形式呢?
小弟等待赐教了~~~(急!!!)
=========================================
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class JTableRef
    extends JFrame {
//数据库变量定义
  private Connection connection;
  private Statement statement;
  private ResultSet resultSet;
  private ResultSetMetaData rsMetaData;
//GUI变量定义
  private JTable table;
  public JTableRef()
  {
//Form的标题
    super("输入SQL语句,按提交按钮查看结果。");
//url中指定ODBC中设置的DSN名称
    String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=abc";
    String username = "sa";
    String password = "sa";
//加载驱动程序以连接数据库
    try {
      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
      connection = DriverManager.getConnection(
          url, username, password);
    }
//捕获加载驱动程序异常
 catch (ClassNotFoundException cnfex) {
      System.err.println("装载 JDBC/ODBC 驱动程序失败。");
      cnfex.printStackTrace();
      System.exit(1); // terminate program
    }
//捕获连接数据库异常
    catch (SQLException sqlex) {
      System.err.println("无法连接数据库");
      sqlex.printStackTrace();
      System.exit(1); // terminate program
    }
//如果数据库连接成功,则建立GUI
//SQL语句//    inputQuery = new JTextArea(test, 4, 30);
//    submitQuery = new JButton("查询");
//Button事件
//    submitQuery.addActionListener(
//        new ActionListener() {
//      public void actionPerformed(ActionEvent e)
//      {
//        getTable();
//      }
//    }
//    );
    JPanel topPanel = new JPanel();
    topPanel.setLayout(new BorderLayout());
//将"输入查询"编辑框布置到 "CENTER"
//    topPanel.add(new JScrollPane(inputQuery), BorderLayout.CENTER);
//将"提交查询"按钮布置到 "SOUTH"
//    topPanel.add(submitQuery, BorderLayout.SOUTH);
    table = new JTable();
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
//将"topPanel"编辑框布置到 "NORTH"
    c.add(topPanel, BorderLayout.NORTH);
//将"table"编辑框布置到 "CENTER"
    c.add(table, BorderLayout.CENTER);
    getTable();
    setSize(500, 300);
//显示Form
    show();
  }
  private void getTable()
  {
    try {
//执行SQL语句
      String test = "SELECT * FROM abc";
//      String query = inputQuery.getText();
      statement = connection.createStatement();
      resultSet = statement.executeQuery(test);
//在表格中显示查询结果
      displayResultSet(resultSet);
    }
    catch (SQLException sqlex) {
      sqlex.printStackTrace();
    }
  }
  private void displayResultSet(ResultSet rs)
      throws SQLException
  {
//定位到达第一条记录
    boolean moreRecords = rs.next();
//如果没有记录,则提示一条消息
    if (!moreRecords) {
      JOptionPane.showMessageDialog(this,"结果集中无记录");
      setTitle("无记录显示");
      return;
    }
    Vector columnHeads = new Vector();
    Vector rows = new Vector();
    try {
//获取字段的名称
      ResultSetMetaData rsmd = rs.getMetaData();
      for (int i = 1; i <= rsmd.getColumnCount(); ++i)
        columnHeads.addElement(rsmd.getColumnName(i));
//获取记录集
      do {
        rows.addElement(getNextRow(rs, rsmd));
      }
      while (rs.next());
//在表格中显示查询结果
      table = new JTable(rows, columnHeads);
      JScrollPane scroller = new JScrollPane(table);
      Container c = getContentPane();
      c.remove(1);
      c.add(scroller, BorderLayout.CENTER);
//刷新Table
      c.validate();
    }catch (SQLException sqlex) {
      sqlex.printStackTrace();
    }
  }
      private Vector getNextRow(ResultSet rs,ResultSetMetaData rsmd)throws SQLException{
    Vector currentRow = new Vector();
    for (int i = 1; i <= rsmd.getColumnCount(); ++i)
      currentRow.addElement(rs.getString(i));
//返回一条记录
    return currentRow;
  }
  public void shutDown(){
    try {
//断开数据库连接
      connection.close();
    }catch (SQLException sqlex) {
      System.err.println("Unable to disconnect");
      sqlex.printStackTrace();
    }
  }
  public static void main(String args[])
  {
    final JTableRef app = new JTableRef();
    app.addWindowListener(
        new WindowAdapter() {
      public void windowClosing(WindowEvent e)
      {app.shutDown();
        System.exit(0);}});
  }}
=======================================
下接MyTableModel网上载例

解决方案 »

  1.   

    MyTableDemo
    ==========================================================
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JScrollPane;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import java.awt.*;import java.awt.event.*;
    /** * <p>Title: 自己定义的表格</p> 
    * <p>Description: 继承AbstractTableModel类,实现自己的表格</p>
    * <p>Copyright: Copyright (c) 2003</p>
    * <p>Filename: MyTableDemo.java</p> */
    public class MyTableDemo extends JFrame {   
      public MyTableDemo() {       
        super("MyTableDemo");     
        //声明自己的表格,并添加到JTable中     
        MyTableModel myModel = new MyTableModel();      
        JTable table = new JTable(myModel);     
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));     
        //将表格添加到可滚动的面板    
        JScrollPane scrollPane = new JScrollPane(table);       
        //将滚动面板添加到窗体   
        getContentPane().add(scrollPane, BorderLayout.CENTER);  
        //添加监听    
        addWindowListener(new WindowAdapter() {  
        public void windowClosing(WindowEvent e) { System.exit(0);  } }); 
    }
    /** * <p>Title: 定义自己的表格模式</p> * 
     * <p>Description: 通过继承AbstractTableModel类来定义自己的表格模式, * 这里使得第三个以后才可以编辑</p> */    
    class MyTableModel extends AbstractTableModel {  
      //定义表头       
      final String[] columnNames = {"姓名","性别","学历","年龄","是否已婚","","","",""};       
        //初始化表数据       
        final Object[][] data = {        
            {"张三","男","大本", new Integer(25), new Boolean(false)},        
            {"李四", "男","大本", new Integer(33), new Boolean(true)},       
            {"王五", "男", "高中", new Integer(20), new Boolean(false)},        
            {"赵倩", "女","大专", new Integer(26), new Boolean(true)},            
            {"周大", "男","大本", new Integer(24), new Boolean(false)}        
        };
        /** *<br>方法说明:继承AbstractTableModel必须实现的方法 *<br>输入参数: *<br>返回类型:int 列数 */ 
        public int getColumnCount() { return columnNames.length; }
        /** *<br>方法说明:继承AbstractTableModel必须实现的方法 *<br>输入参数: *<br>返回类型:int 列数 */   
        public int getRowCount() { return data.length;}
        /** *<br>方法说明:继承AbstractTableModel必须实现的方法 *<br>输入参数: *<br>返回类型:String 列名 */  
        public String getColumnName(int col) { return columnNames[col];}
    /** *<br>方法说明:继承AbstractTableModel必须实现的方法,获取表格中的数据 *<br>输入参数:int row 行数 **
     *  <br>输入参数:int col 列数 *<br>返回类型:Object 数据对象 */    
        public Object getValueAt(int row, int col) {  return data[row][col]; }
         /** *<br>方法说明:实现这个方法使得最后一列不是显示true和false。
          而是使用检查盒 *<br>输入参数: *<br>返回类型: */        
         public Class getColumnClass(int c) {  return getValueAt(0, c).getClass(); }
         /** *<br>方法说明:这个方法不一定需要实现。这里是为了定义可编辑的列 *<br>输入参数:
         *<br>返回类型:boolean 是否可编辑 */      
        public boolean isCellEditable(int row, int col) {     
          if (col < 2) {               return false;      
          } else {           return true;        
          }        }
        /** *<br>方法说明:实现此方法,获得编辑数据。 *<br>输入参数: *<br>返回类型: */   
         public void setValueAt(Object value, int row, int col) {               
           System.out.println("修改数据位置: " + row + "," + col + " 新数据为: " + value);          
           data[row][col] = value;           
           fireTableCellUpdated(row, col);      
    //       MyTableModel m = new MyTableModel();
    //       m.fireTableDataChanged();
           System.out.println("表格新数据:");           
           printDebugData();        }
         /** *<br>方法说明:输出表格中的新数据 *<br>输入参数: *<br>返回类型: */  
         private void printDebugData() {           
           int numRows = getRowCount();           
           int numCols = getColumnCount();         
           for (int i=0; i < numRows; i++) {       
             System.out.print("    行 " + i + ":");  
             for (int j=0; j < numCols; j++) {       
               System.out.print("  " + data[i][j]);   
             }                System.out.println();   
           }            System.out.println("--------------------------");     
         }    
       }
       /** *<br>方法说明:主方法 *<br>输入参数: *<br>返回类型: */ 
       public static void main(String[] args) {    
         JFrame.setDefaultLookAndFeelDecorated(true);   
         MyTableDemo frame = new MyTableDemo();       
         frame.pack(); 
         frame.setVisible(true); 
       }
     }
    ==================================================================