import javax.swing.*;
import javax.swing.table.*;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.sql.*;
import java.util.Vector;public class JDBCtest2 extends JFrame{ JTable table = null; 
JScrollPane scroller = null;
private JDBCtest2(){
Driver d = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
try {
DriverManager.registerDriver(d);
} catch (SQLException e) {
e.printStackTrace();
}
launchFrame();
}

private void launchFrame(){
this.setName("jFrame");
this.setSize(300, 150);
this.setTitle("Test");
this.setVisible(true); 
table = new JTable(new MyTableModel(load()));
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);  
table.setPreferredScrollableViewportSize(new Dimension(550, 30));
scroller = new JScrollPane(table);
scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); this.getContentPane().add(scroller,BorderLayout.CENTER);
}

private ResultSet load(){
ResultSet rs =null;
String sql = "select * from Country where cCountry like 'A%'";
try {
Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" +
" DatabaseName=HR;user=sa;password=12134");
Statement stmt = con.createStatement();
rs = stmt.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}

public static void main(String[] args) {
JDBCtest2 test = new JDBCtest2();
}

private class MyTableModel extends AbstractTableModel{

private Vector columnHeads = new Vector();  
private Vector rows = new Vector();  
private ResultSetMetaData rsmd =null;
private ResultSet RS =null;
private int count ;

public Class<?> getColumnClass(int columnIndex) {
return rows.elementAt(columnIndex).getClass();
} public String getColumnName(int column) {
return (String)columnHeads.elementAt(column);
} public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
} public int getColumnCount() {
return  columnHeads.size();
} public int getRowCount() {
return rows.size();
} public Object getValueAt(int rowIndex, int columnIndex) {
Vector rowData = (Vector) (rows.elementAt(rowIndex));
return rowData.elementAt(columnIndex);
} public MyTableModel(ResultSet rs){
try {
this.RS = rs;
rsmd = rs.getMetaData();
count = rsmd.getColumnCount();
columnHeads = new Vector(count);
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )  
             columnHeads.addElement( rsmd.getColumnName( i ) );  
while ( rs.next() ){
 Vector<String> currentRow = new Vector();  
             for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) 
             {  
                 currentRow.addElement( rs.getString( i ) );  
             } 
             rows.addElement(currentRow); 
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}如上代码 我要显示数据到Jtable 我运行时 一开始只有Frame显示出来 没有Jtable显示
但是只有我改变一下JFrame的大小或者做其他改变JFRAME界面状态的操作 带数据的Jtable就出来了
为什么一开始运行时没显示呢?

解决方案 »

  1.   

    this.setVisible(true); 
    table = new JTable(new MyTableModel(load())); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);  
    table.setPreferredScrollableViewportSize(new Dimension(550, 30)); 
    scroller = new JScrollPane(table); 
    scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); this.getContentPane().add(scroller,BorderLayout.CENTER); 
    this.setVisible(true); 修改setVisible到下面的位置