我们在java swing中完成了这段代码。我们有一个数据库表节点和该表nodecopy的副本。我们的动机是从特定节点到另一个目的地画一条线。 这里+ tablename +是指每次点击屏幕时创建的表格(单击时也会创建一个节点)。
此代码显示错误为invalid cursor state
和result state not closed
请指导
public void paint(Graphics g)
{
int stX,stY,endX,endY;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:router");
Statement sta = con.createStatement();
ResultSet rs=sta.executeQuery("Select * from nodecopy;");
String tablename;
ResultSet rs1;
while(rs.next())
{
tablename=rs.getString("1");
tablename=tablename.trim();
System.out.println("select * from "+tablename+";");
try
{
rs1=sta.executeQuery("select * from "+tablename+";");
String name,val;
if(rs1.next())
{
name=rs1.getString(1);
val=rs1.getString(2);
System.out.println(name+":"+val);
}
a=search(node_name,tablename);
stX=node_x_coordinate[a];
stY=node_y_coordinate[a];
String dest=rs1.getString(1);
b=search(node_name,dest);
endX=node_x_coordinate[b];
endY=node_y_coordinate[b];
System.out.println(tablename+"\t"+dest+"\t"+stX+"\t"+stY+"\t"+endX+"\t"+endY);
Color clr=new Color((int)(Math.random()*999999999));
g.setColor(clr);
g.drawLine(stX,stY,endX,endY);
JLabel vall;
add(vall=new JLabel(rs1.getString(2).trim()));
vall.setForeground(clr);
vall.setBounds((stX+endX)/2,(stY+endY)/2,40,40);
System.out.println(tablename+"\t"+dest+"\t"+stX+"\t"+stY+"\t"+endX+"\t"+endY);
}
catch(Exception e)
{
System.out.println(e);
sta.execute("delete from nodecopy where node='"+tablename+"';");
sta = con.createStatement();
rs=sta.executeQuery("Select * from nodecopy;");
}
}//end of while
sta.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
答案 0 :(得分:1)
sta.close()
语句与finally
块未加入e.printStackTrace()
而不是System.out.println(e)
),可能更容易找到。paint
方法中执行数据库查询。它将阻止Event Dispatch线程。您应该在后台线程上执行查询,并为JComponent
JComponent#paintComponent( Graphics )
而不是JComponent#paint( Graphics )
方法paintComponent
方法时,请不要忘记致电super.paintComponent
答案 1 :(得分:0)
在finally块中尝试按此顺序关闭所有resultSet,语句,连接。