最近在 网络 上看见关于此标题的文章颇多,但内容大多相同,没有一个文章从头到尾给出完整的源代码,令许多初学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 ); 


); 

}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐