Java Swing jComboBox 未从数据库中填充
Posted
技术标签:
【中文标题】Java Swing jComboBox 未从数据库中填充【英文标题】:Java Swing jComboBox not filling from Database 【发布时间】:2013-09-07 08:24:28 【问题描述】:因此,我正在为我母亲的慈善项目制定工作组时间表。目的是检查志愿者,显示名册的时间和他们所在的车站。我已经成功构建了一个登录表单,它从数据库中提取数据并验证您输入的用户名(来自下拉菜单)和密码是否正确。我有这个方法(注意:对于登录表单,它可以工作并且不是问题)来填充名为'cbxUsername'
的用户名下拉列表,当窗口加载时在主方法中调用它:
public void loginToProgram() throws Exception
user = (String) cbxUsername.getSelectedItem();
if(user == "Please select a username")
JOptionPane.showMessageDialog(null, "Sorry, You need to select a username to continue");
else if(txtPassword.getText().length() == 0)
JOptionPane.showMessageDialog(null, "Sorry, You need to enter a password to continue");
else
checkAuth();
然后就是上面提到的这个方法,就是checkAuth()方法:
public void checkAuth() throws Exception
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/crm", "root", "t00rt00r");
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `password` FROM users WHERE `username` = '"+ user +"'");
ResultSet result = statement.executeQuery();
if(result.next() != false)
pass = result.getString(1);
if(txtPassword.getText().equalsIgnoreCase(pass))
//JOptionPane.showMessageDialog(null, "Worked");
CheckIn chk = new CheckIn();
chk.setVisible(true);
else
JOptionPane.showMessageDialog(null, "Sorry, wrong password");
现在我已经复制了第一个代码(方法“loginToProgram()”)并稍作修改。
现在我有一个名为“CheckIn”的新窗口,其中包含一个名为“cbxCIFirstName”的 jComboBox。填充此组合框的代码是:
public static void fillFirstNameCombobox() throws Exception
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/crm", "root", "t00rt00r");
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `first_name` FROM `volunteers`");
ResultSet result = statement.executeQuery();
cbxCIFirstName.setToolTipText("Select a first name");
cbxCIFirstName.setEditable(true);
cbxCIFirstName.addItem("Please Select a first name");
while(result.next())
cbxCILastName.addItem(result.getString(1));
System.out.println(result.getString(1));
请注意:我将System.out.println(result.getString(1));
放在那里只是为了查看它是否在控制台中通过,而它没有在控制台中通过。我究竟做错了什么?这是我的主要方法:
public static void main(String[] args) throws Exception
EventQueue.invokeLater(new Runnable()
public void run()
try
fillFirstNameCombobox();
CheckIn frame = new CheckIn();
frame.setVisible(true);
catch (Exception e)
e.printStackTrace();
);
我们将不胜感激任何建议、任何 cmets、指南、教程或任何我会考虑并尝试的东西!
感谢您抽出宝贵时间阅读这篇文章,并提前感谢您的回答, 乔什。
【问题讨论】:
user == "Please select a username"
:使用equals
检查String
是否相等。
在赋值时只使用一个等于,即'='
user="string" 和 userB="string",对于 user==userB,您将收到 false,但对于 user.equals(userB),您将收到 true,但是如果您有 userB=user,那么 user= =userB 为真,因为它是同一个对象。
您正在调用 System.out.println(result.getString(1));就在循环结束时,当 ResultSet 状态没有下一个元素时,尝试在循环中添加该打印。
【参考方案1】:
public static void fillFirstNameCombobox() throws Exception
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/crm", "root", "t00rt00r");
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `first_name` FROM `volunteers`");
ResultSet result = statement.executeQuery();
cbxCIFirstName.setToolTipText("Select a first name");
cbxCIFirstName.setEditable(true);
cbxCIFirstName.addItem("Please Select a first name");
while(result.next())
cbxCILastName.addItem(result.getString(1));
System.out.println(result.getString(1));// this line can not be outside while loop
这样做
public static void fillFirstNameCombobox() throws Exception
Class.forName("com.mysql.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/crm", "root", "t00rt00r");
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT first_name FROM volunteers");
ResultSet result = statement.executeQuery();
cbxCIFirstName.setToolTipText("Select a first name");
cbxCIFirstName.setEditable(true);
cbxCIFirstName.addItem("Please Select a first name");
while(result.next())
cbxCILastName.addItem(result.getString(1));
System.out.println(result.getString(1));// this line can not be outside while loop
原因
实际上光标位于顶层。当您调用 result.next) 时,光标会下降,最后光标位于底部。
这意味着最后它返回 false 并且控制权消失了。
您正在尝试在 while
之后打印,这意味着光标已经在底部,所以这就是问题所在。
您使用preparedstatement 的方式也不是正确的方式。 用这种方式
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `password` FROM users WHERE `username` = ?);
statement.setString(1,user );
【讨论】:
我试过了,我原来连print out语句都没有,不行。 @Josh 你试过我的方法了吗?如果是,你会收到任何错误,如果是,则发布错误,否则发布输出 是的,我完全复制了你的代码,它给了我和我做它时完全相同的东西,什么都没有。我没有遇到任何错误。谢谢 @Josh 尝试这种方式,让我知道 SELECT * FROM 志愿者。只需编辑您的代码并替换为这一行。如果您的表不为空,那么您肯定会输出 我休息了一下,我尝试了你说的preparedstatement,似乎有效。谢谢!【参考方案2】:对于所有正在阅读此线程的人,我使用@javaBeginner 给出的正确preparedStatement 方法修复了它(谢谢),然后我没有从main 方法调用方法“fillFirstNameCombobox()”,而是从类的构造函数,所以这个类叫做“ClockIn”,我在构造函数/方法的最后一行调用了“ClockIn()”
【讨论】:
以上是关于Java Swing jComboBox 未从数据库中填充的主要内容,如果未能解决你的问题,请参考以下文章
Java Swing 编程 JComboBox 实现模糊查找功能。
Java Swing 编程 JComboBox 显示不全问题。
Java Swing应用程序 JComboBox下拉框联动查询