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用这种方法试试,让我知道从志愿者那里选择*。只需编辑你的代码并替换为这一行。如果你的表不是空的,那么你肯定会输出。我休息了一下,我尝试了你所说的准备好的声明,似乎行得通。谢谢!