| 最近在网络上看见关于此标题的文章颇多,但内容大多相同,没有一个文章从头到尾给出完整的源代码,令许多初学Swing者感到困惑。本文正是为解决这一问题而专门为广大初学者设计的,程序执行结果如下图所示。  本程序采用MSAccess数据库,Database名称为DBAddressBook,Table名称为TblAddressBook。表结构如下:
字段名 类型
编号 Text(50)
姓名 Text(50)
电话 Text(50)
地址 Text(50)
由于本人对该程序的注释极为详细,故不再作进一步的讲解,该程序在Windows2000,jdk1.3下编译并成功运行。 下载源代码。
执行方法: 参照上表设计数据库,并配置ODBC的DSN名称为AddressBook。
javac DisplayQueryResults.java DisplayQueryResults //DisplayQueryResults.java import java.sql.*; import javax.swing.*; import java.awt.*;
import java.awt.event.*; import java.util.*; public class DisplayQueryResults extends JFrame {
//数据库变量定义 private Connection connection; private Statement statement; private ResultSet resultSet; private ResultSetMetaData rsMetaData;
//GUI变量定义 private JTable table; private JTextArea inputQuery; private JButton submitQuery; public DisplayQueryResults() {
//Form的标题 super( "输入SQL语句,按提交按钮查看结果。" ); //url中指定ODBC中设置的DSN名称 String url = "jdbc:odbc:AddressBook"; String username = ""; String password = ""; //加载驱动程序以连接数据库
try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); 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语句 String test="SELECT * FROM TblAddressBook"; 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 query = inputQuery.getText(); statement = connection.createStatement(); resultSet = statement.executeQuery( query );
//在表格中显示查询结果 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 DisplayQueryResults app = new DisplayQueryResults(); app.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) {
app.shutDown(); System.exit( 0 ); } } ); } }
|