Java Swing jComboBox未从数据库填充

Java Swing jComboBox未从数据库填充,java,sql,database,swing,jdbc,Java,Sql,Database,Swing,Jdbc,所以我正在为我母亲的慈善项目制定一个特别工作组时间表。目的是登记志愿者,显示时间和他们所在的站点的花名册。我已经成功构建了一个登录表单,它从数据库中提取数据,并验证您输入的用户名(从下拉列表中)和密码是否正确。我有一个方法(注意:对于登录表单,它是有效的,不是问题)来填充名为'cbxUsername'的用户名下拉列表,当窗口加载时,它在主方法内部调用: public void loginToProgram() throws Exception{ user = (String) c

所以我正在为我母亲的慈善项目制定一个特别工作组时间表。目的是登记志愿者,显示时间和他们所在的站点的花名册。我已经成功构建了一个登录表单,它从数据库中提取数据,并验证您输入的用户名(从下拉列表中)和密码是否正确。我有一个方法(注意:对于登录表单,它是有效的,不是问题)来填充名为
'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()方法:

现在,我复制了第一个代码(“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();
            }
        }
    });
}
任何建议、任何评论、指南、教程或任何我将考虑并尝试的内容都将不胜感激

感谢您抽出时间阅读本文,并提前感谢您的回答, 乔希

走这边

  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
        }

}
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `password` FROM users WHERE `username` = ?);
statement.setString(1,user );
原因

实际上,光标位于顶层。当您调用result.next)时,光标向下移动,最后光标位于底部。 这意味着在最后,它返回false,而控制权从中间出来。 您试图在
之后打印,而
意味着光标已经在底部,这就是问题所在

另外,您使用preparedstatement的方式也不正确。 这样

  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
        }

}
PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT `password` FROM users WHERE `username` = ?);
statement.setString(1,user );

对于所有阅读此线程的人,我使用@java初学者(谢谢)给出的正确preparedStatement方法修复了它,然后我从类的构造函数调用了方法“fillFirstNameCombobox()”,而不是从主方法调用该方法,因此该类被称为“ClockIn”,我在构造函数/方法的最后一行调用了它“ClockIn()”

user==“请选择一个用户名”
:使用
equals
检查
String
是否相等。您只使用一个equals ie,'=',当分配valueuser=“String”和userB=“String”时,用户==userB将收到false,而user.equals(userB)将收到true但是,如果您有userB=user,那么user==userB将为true,因为它是同一个对象。您正在调用System.out.println(result.getString(1));当循环结束时,当ResultSet状态没有下一个元素时,尝试在循环中添加该打印。我尝试了,我最初甚至没有打印输出语句,它不起作用。@Josh你尝试过我的方法吗?如果是,你得到任何错误如果是,发布错误,其他发布输出是,我复制了你的代码,它给了我e我做的和我做的一样,没有什么。我没有遇到任何错误。Thanks@Josh用这种方法试试,让我知道从志愿者那里选择*。只需编辑你的代码并替换为这一行。如果你的表不是空的,那么你肯定会输出。我休息了一下,我尝试了你所说的准备好的声明,似乎行得通。谢谢!