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下拉框联动查询

如何将选定的 JComboBox 数据项提取到 Swing 文本字段中?

java怎样获取JComboBox的数据

如何在 Swing 中的 JTable 的列中添加不同的 JComboBox 项