初学,写了一个关于打开数据库的小程序,请大家看看!
数据库中有三条不同的记录,但是在按“打开数据库”按钮打开以后,显示的是三条相同的记录,都是最后一条。不知为什么,还请大家指教!
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.sql.*;
import java.awt.*;
import javax.swing.table.*;
class Window extends JFrame implements ActionListener
{
JButton button;
JScrollPane sp;
JPanel panel;
JTable table;
Container container;
Connection con;
Statement sql;
ResultSet rs;
MyTableModel tm;
Window()
{
super("数据库");
button=new JButton("打开数据库");
panel=new JPanel();
tm=new MyTableModel();
table=new JTable(tm);
container=getContentPane();
sp=new JScrollPane(table);
//sp.setViewportView(table);
container.add(sp,"Center");
panel.add(button);
container.add(panel,"South");
button.addActionListener(this);
setBounds(200,150,700,500);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent ee)
{
if(ee.getSource()==button)
{
try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(ClassNotFoundException e){}
try{
con=DriverManager.getConnection("jdbc:odbc:MS"," "," ");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM loan");
tm.rowdata.removeAllElements();
while(rs.next())
{
tm.data.removeAllElements();
tm.data.addElement(String.valueOf(rs.getLong(1)));
tm.data.addElement(rs.getString(2));
tm.data.addElement(rs.getString(3));
tm.data.addElement(rs.getDate(4).toString());
tm.rowdata.addElement(tm.data);
}
con.close();
tm.fireTableDataChanged();
}
catch(SQLException e1){}
}
}
}
public class jtable
{
public static void main(String args[])
{
Window window=new Window();
}
}
class MyTableModel extends AbstractTableModel
{
Vector data,rowdata,columnnames;
MyTableModel()
{
data=new Vector();
rowdata=new Vector();
columnnames=new Vector();
columnnames.addElement("编号");
columnnames.addElement("姓名");
columnnames.addElement("书名");
columnnames.addElement("借阅时间");
data.addElement("");
data.addElement("");
data.addElement("");
data.addElement("");
rowdata.addElement(data);
}
public int getColumnCount()
{
return columnnames.size();
}
public int getRowCount()
{
return rowdata.size();
}
public String getColumnName(int col)
{
return columnnames.get(col).toString();
}
public Object getValueAt(int row,int col)
{
return ((Vector)rowdata.elementAt(row)).elementAt(col);
}
public boolean isCellEditable(int row, int col)
{
return false;
}
}
问题点数:50、回复次数:4Top
1 楼GoldApple(锋哥哥)回复于 2003-05-04 01:35:27 得分 50
我估计错误是出在 actionPerformed 方法中的 tm.rowdata.addElement(tm.data); 你在循环中只是清除了 tm.data 里面的元素,但是 tm.data 对象还是没有变化的!而 addElement 只保存了对 tm.data 的引用,这种情况就很像使用 Vector 保存 String[] 数组对象一样,你试试下面两段代码,它们是不同的
片断一:
Vector v = new Vector();
String[] a = new String[2];
int i,counter=0;
for(i=0;i<3;i++)
{
a[0]="" + counter++;
a[1]="" + counter++;
v.add(a);
}
for(i=0;i<3;i++)
{
String[] test=(String[])v.get(i);
System.out.println(test[0]+"***"+test[1]);
}
片断二:
Vector v = new Vector();
String[] a = null;
int i,counter=0;
for(i=0;i<3;i++)
{
a = new String[2];
a[0]="" + counter++;
a[1]="" + counter++;
v.add(a);
}
for(i=0;i<3;i++)
{
String[] test=(String[])v.get(i);
System.out.println(test[0]+"***"+test[1]);
}
所以,我估计你的程序也是应该把 tm.data 指向新的对象才能适用你的要求了。Top
2 楼kurama(kurama)回复于 2003-05-04 21:12:52 得分 0
我再改了一下,这下正确了,就是你说的那个问题!谢了哈!Top




