这个例子已经可以从数据库(时时更新的数据库)里面读数据,并按照表的形式显示,但表怎么才能时时的刷新呢?我加了一个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网上载例
网站上我看有人说用,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网上载例
==========================================================
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);
}
}
==================================================================