【问题标题】:Java Swing jComboBox not filling from DatabaseJava Swing jComboBox 未从数据库中填充
【发布时间】: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 状态没有下一个元素时,尝试在循环中添加该打印。

标签: java sql database swing jdbc


【解决方案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()”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多