高分请教一个小问题。请进! 呵呵,你的程序好奇怪, rs.next(),不是在JDBC里的吗,怎么跑到客户端去了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 的确是jdbc里的,我是在客户端先连接到指定的数据库服务器上,然后将一些数据库信息返回到客户端。 DataBaseVector初始化能成功加近去嗎﹖我懷疑是new Planet的問題 是挺奇怪的,DataBaseVector.addElement(new Planet("abc"));执行的成功吗? 怎么不用ArrayList??你可以System.out把rs.getString(1)大出来看看 ClientFrame()方法中初始化的值都加进去了,但运行到DataOpen方法就不行了,DataBaseVector.addElement(new Planet("abc"))和while中的addElement都没有被执行,但是while中的textArea.append(rs.getString(1)+" ")被执行了,且结果正确。如果那位大侠需要,我可以将源码全部贴出(全部代码不到200行),只要能帮我解决问题,谢谢了。 这主要是组件没有自动更新功能,你不能根据一个Vector来构造一个JList,然后就向Vector添加元素来让JList自动更新,而应该用ListModel来构造JList,或者直接向JList添加成员,用JList.add()方法,不能自动更新的话,还要调用JList.validate()方法。看看书吧,sun有一套介绍swing的教材,还不错,可以打基础,java turtail也可以。 菜单的生成和JList的生成是不一样的吧!!!他的程序是向Vector里面添加元素。而不是直接向JList 可是,在我看来,应该不是组建没有自动更新的问题,因为我在ClientFrame()方法中后来添加的Mercury2、Mercury3、Mercury4都被自动更新了,而再DataOpen()方法中对DataBaseVector的任何操作都不会起作用,相反,列表框也不再对鼠标有响应。我用的是jdk1.3,很奇怪的是,我原先用add()方法,编译时居然提示我“add方法为不能解析的符号”,可是查jdk文档是有这个方法的。于是我不得不使用了矢量来构造列表框,文档中有此类构造器JList(Vector listData) 。下面是我的源代码:import java.io.*;import java.net.*;import java.util.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.sql.*;class Clk_Client{ public static void main(String[] args) { JFrame frame=new ClientFrame(); frame.show(); }}class ClientFrame extends JFrame implements ActionListener{ public ClientFrame() { setTitle("客户端"); setSize(600,480); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); JPanel p=new JPanel(); ServerLabel =new JLabel("数据源:"); serverName= new JTextField(10); UserLabel= new JLabel("用户名:"); UserID =new JTextField(10); PassWordLabel=new JLabel("密码:"); PassWord=new JPasswordField(10); PassWord.setEchoChar('*'); startButton =new JButton("连接"); execButton =new JButton("执行"); p.add(ServerLabel); p.add(serverName); p.add(UserLabel); p.add(UserID); p.add(PassWordLabel); p.add(PassWord); p.add(startButton); p.add(execButton); startButton.addActionListener(this); execButton.addActionListener(this); getContentPane().add(p,"North"); //DataBaseVector= new Vector(); DataBaseVector.addElement(new Planet("Mercury1")); DataBaseList =new JList(DataBaseVector); DataBaseScrollPane=new JScrollPane(DataBaseList); DataBaseVector.addElement(new Planet("Mercury2")); DataBaseVector.addElement(new Planet("Mercury3")); DataBaseVector.addElement(new Planet("Mercury4")); TableList =new JList(databases); TableScrollPane=new JScrollPane(TableList); SqlArea=new JTextArea(); SqlScrollPane=new JScrollPane(SqlArea); textArea=new JTextArea(); scrollPane=new JScrollPane(textArea); JSplitPane innerPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,TableScrollPane,SqlScrollPane); JSplitPane outinnerPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,DataBaseScrollPane,innerPane); JSplitPane outerPane= new JSplitPane(JSplitPane.VERTICAL_SPLIT,outinnerPane, scrollPane); //DataBaseList.addListSelectionListener(this); getContentPane().add(outerPane,"Center"); } public void actionPerformed(ActionEvent evt) { String arg=evt.getActionCommand(); if (arg.equals("连接")) { //System.out.println(PassWord.getPassword().toString()); DataOpen(serverName.getText(),UserID.getText(),new String(PassWord.getPassword())); } else if(arg.equals("执行")) { System.out.println("执行"); } } public void DataOpen(String Sname,String sa,String Pword) { String url="jdbc:odbc:"+Sname; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(java.lang.ClassNotFoundException e) { ErrorOutPut("ClassNotFoundException: "+e.getMessage()); } try { con = DriverManager.getConnection(url,sa,Pword); stmt = con.createStatement(); String query = "select name from master.dbo.sysdatabases"; ResultSet rs = stmt.executeQuery(query); ErrorOutPut(""); //DataBaseVector.clear(); DataBaseVector.addElement(new Planet("Mercury5")); while (rs.next()) { textArea.append(rs.getString(1)+" "); DataBaseVector.addElement(new Planet("Mercury6")); } } catch(SQLException ex) { ErrorOutPut("SQLException: " + ex.getMessage()); } } public void ErrorOutPut(String error) { textArea.replaceRange(error,0,textArea.getText().length()); } private JLabel ServerLabel; private JLabel UserLabel; private JLabel PassWordLabel; private JTextField serverName; private JTextField UserID; private JPasswordField PassWord; private JButton startButton; private JButton execButton; private JList DataBaseList; private Vector DataBaseVector=new Vector(); private JList TableList; private Planet[] databases= { new Planet("Mercury"), new Planet("Venus"), new Planet("Earth"), new Planet("Mars"), new Planet("Jupiter"), new Planet("Saturn"), new Planet("Uranus"), new Planet("Neptune"), new Planet("Pluto"), }; private JScrollPane scrollPane; private JScrollPane DataBaseScrollPane; private JScrollPane TableScrollPane; private JScrollPane SqlScrollPane; private JTextArea textArea; private JTextArea SqlArea; private Connection con=null; private Statement stmt=null; private ServerHandler ServerOpen; private Thread newHandlerThread;}class Planet{ public Planet(String n) { name = n; } public String toString() { return name; } private String name;} :)我同意cherami(cherami)的观点,这的确是组件同步更新的问题……在你的程序中,VECTOR的值是肯定改变了的,你可以打印出来看;不过当VECTOR更新后,JLIST并不会同步更新,这就是问题所在;就你的程序而言,也不用象cherami(cherami)说的那么麻烦,VECTOR的值更新后,执行这句即可:“DataBaseList.setListData(DataBaseVector);”…… Thank you ,very very!!! 北大青鸟都会讲哪些javaee内容? 初学者的问题(hello world级别) 请教一下关于包名的问题 急求助! 高分求助!!! 在使用RMI时遇到的大问题! 谁知道怎么实现用代理服务器访问网页(用java)??-在线等待。。 求高手点拨一个“Java Swing制作的好友列表”中可能存在的问题。 有了Swing,还有必要使用AWT吗? 请教中间件(我是初学者) vb能访问mysql数据库吗??? lusxiao,ender:你们以前都有帮我解决过问题的,再来帮帮我吧。 急,急,急!
执行的成功吗?
你可以System.out把rs.getString(1)大出来看看
看看书吧,sun有一套介绍swing的教材,还不错,可以打基础,java turtail也可以。
他的程序是向Vector里面添加元素。而不是直接向JList
我用的是jdk1.3,很奇怪的是,我原先用add()方法,编译时居然提示我“add方法为不能解析的符号”,可是查jdk文档是有这个方法的。于是我不得不使用了矢量来构造列表框,文档中有此类构造器JList(Vector listData) 。下面是我的源代码:import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;class Clk_Client
{ public static void main(String[] args)
{
JFrame frame=new ClientFrame();
frame.show();
}
}class ClientFrame extends JFrame implements ActionListener
{ public ClientFrame()
{ setTitle("客户端");
setSize(600,480);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
});
JPanel p=new JPanel();
ServerLabel =new JLabel("数据源:");
serverName= new JTextField(10);
UserLabel= new JLabel("用户名:");
UserID =new JTextField(10);
PassWordLabel=new JLabel("密码:");
PassWord=new JPasswordField(10);
PassWord.setEchoChar('*');
startButton =new JButton("连接");
execButton =new JButton("执行");
p.add(ServerLabel);
p.add(serverName);
p.add(UserLabel);
p.add(UserID);
p.add(PassWordLabel);
p.add(PassWord);
p.add(startButton);
p.add(execButton);
startButton.addActionListener(this);
execButton.addActionListener(this);
getContentPane().add(p,"North");
//DataBaseVector= new Vector();
DataBaseVector.addElement(new Planet("Mercury1"));
DataBaseList =new JList(DataBaseVector);
DataBaseScrollPane=new JScrollPane(DataBaseList);
DataBaseVector.addElement(new Planet("Mercury2"));
DataBaseVector.addElement(new Planet("Mercury3"));
DataBaseVector.addElement(new Planet("Mercury4"));
TableList =new JList(databases);
TableScrollPane=new JScrollPane(TableList);
SqlArea=new JTextArea();
SqlScrollPane=new JScrollPane(SqlArea);
textArea=new JTextArea();
scrollPane=new JScrollPane(textArea);
JSplitPane innerPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,TableScrollPane,SqlScrollPane);
JSplitPane outinnerPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,DataBaseScrollPane,innerPane);
JSplitPane outerPane= new JSplitPane(JSplitPane.VERTICAL_SPLIT,outinnerPane, scrollPane);
//DataBaseList.addListSelectionListener(this);
getContentPane().add(outerPane,"Center");
} public void actionPerformed(ActionEvent evt)
{ String arg=evt.getActionCommand();
if (arg.equals("连接"))
{ //System.out.println(PassWord.getPassword().toString());
DataOpen(serverName.getText(),UserID.getText(),new String(PassWord.getPassword()));
}
else if(arg.equals("执行"))
{ System.out.println("执行");
}
}
public void DataOpen(String Sname,String sa,String Pword)
{
String url="jdbc:odbc:"+Sname;
try
{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(java.lang.ClassNotFoundException e)
{
ErrorOutPut("ClassNotFoundException: "+e.getMessage());
}
try
{
con = DriverManager.getConnection(url,sa,Pword);
stmt = con.createStatement();
String query = "select name from master.dbo.sysdatabases";
ResultSet rs = stmt.executeQuery(query);
ErrorOutPut("");
//DataBaseVector.clear();
DataBaseVector.addElement(new Planet("Mercury5"));
while (rs.next())
{
textArea.append(rs.getString(1)+" ");
DataBaseVector.addElement(new Planet("Mercury6"));
}
}
catch(SQLException ex)
{
ErrorOutPut("SQLException: " + ex.getMessage());
}
}
public void ErrorOutPut(String error)
{ textArea.replaceRange(error,0,textArea.getText().length());
}
private JLabel ServerLabel;
private JLabel UserLabel;
private JLabel PassWordLabel;
private JTextField serverName;
private JTextField UserID;
private JPasswordField PassWord;
private JButton startButton;
private JButton execButton;
private JList DataBaseList;
private Vector DataBaseVector=new Vector();
private JList TableList;
private Planet[] databases=
{
new Planet("Mercury"),
new Planet("Venus"),
new Planet("Earth"),
new Planet("Mars"),
new Planet("Jupiter"),
new Planet("Saturn"),
new Planet("Uranus"),
new Planet("Neptune"),
new Planet("Pluto"),
};
private JScrollPane scrollPane;
private JScrollPane DataBaseScrollPane;
private JScrollPane TableScrollPane;
private JScrollPane SqlScrollPane;
private JTextArea textArea;
private JTextArea SqlArea;
private Connection con=null;
private Statement stmt=null;
private ServerHandler ServerOpen;
private Thread newHandlerThread;
}class Planet
{ public Planet(String n)
{ name = n;
} public String toString()
{ return name;
}
private String name;
}
我同意cherami(cherami)的观点,这的确是组件同步更新的问题……
在你的程序中,VECTOR的值是肯定改变了的,你可以打印出来看;
不过当VECTOR更新后,JLIST并不会同步更新,这就是问题所在;
就你的程序而言,也不用象cherami(cherami)说的那么麻烦,VECTOR的值更新后,执行这句即可:“DataBaseList.setListData(DataBaseVector);”……