我已经创建了一个GUI,并有一个数据库位于外部,我从中获取数据。我正在使用NetBeans中的GUI构建器来做到这一点。有人知道一个简单的方法来填充一个jComboBox值来自数据库吗?当我运行项目时,没有错误,但组合框仍然为空。
下面的代码用于设置包含折扣名称的组合框:
public void setDiscountNames(String type, JComboBox cbox) {
cbox.removeAllItems();
ArrayList<Discount> names = new ArrayList<Discount>();
try {
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/abpp034?user=abpp034&password=120001772");
stmt = con.prepareStatement("SELECT Name FROM Discount WHERE Type = "" + type + """);
rs = stmt.executeQuery();
while(rs.next()){
cbox.addItem(rs.getString("Name"));
}
} catch (SQLException ex) {
Logger.getLogger(Model.class.getName()).log(Level.SEVERE, null, ex);
}
}
它位于与jComboBox对象分开的一个类中。这个类叫做Model。
这里是我调用setDiscountNames方法的地方在一个名为DiscountGUIView的表单中:
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt){
model.setDiscountNames("Fixed", jComboBox1);
}
ok (Update)查询确实打印结果:
run:
旅游标准固定的标准构建成功(总时间:1秒)
可能您的SELECT
查询没有返回任何结果。为了验证这一点,可以在while (rs.next())
循环中添加日志记录语句。我的SQL知识有点生疏,但我记得使用'
(单引号)的字符串字面量,而你使用"
(双引号)在你的语句。
除此之外,我还看到了一些可能导致问题的事情:
-
PreparedStatement
的SQL代码不应该通过字符串连接创建。相反,使用?
代替将被替换到语句中的参数值,例如stmt = con.prepareStatement("SELECT Name FROM Discount WHERE Type = ?"); stmt.setString(1, type); // first (and only) parameter rs = stmt.executeQuery();
-
强烈建议在使用完JDBC资源后显式地关闭它们。为此,您需要在
catch (SQLException ...)
之后添加一个finally
块,例如} finally { try { if (rs != null) rs.close(); } catch (SQLException ignore) {} try { if (stmt != null) stmt.close(); } catch (SQLException ignore) {} try { if (conn != null) conn.close(); } catch (SQLException ignore) {} }
或者,最好使用
try-with-resources
语句(如果您使用的是Java 7或更高版本):try (Connection con = DriverManager.getConnection(...)) { // ... try (PreparedStatement stmt = con.prepareStatement("SELECT Name FROM Discount WHERE Type = ?")) { // ... try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { // processing } } } } catch (SQLException) { Logger....; } // notice no finally block; resources are closed automatically
当尝试向组合框动态添加元素时,使用MutableComboBoxModel.addElement
JComboBox box = new JComboBox(new DefaultComboBoxModel());
....
MutableComboBoxModel model = (DefaultComboBoxModel)box.getModel();
while (rs.next()) {
model.addElement(rs.getString("Name"));
}
要删除所有元素,还可以执行
((DefaultComboBoxModel)box.getModel).removeAllElements();
使用模型方法将触发必要的更改来更新ui
编辑:这是你的基本错误…你正在调用ActionPerformed中的方法!!
classConstructor(){
setDiscountNames("Fixed", jComboBox1); // call this method here.. This will work.
}
如果值打印正确,那么试试这个…
List<String> strings = new ArrayList<String>();
while(rs.next()){
strings.add(rs.getString("Name")); // Confirm if "Name" is valid
}
cbox.addItem(strings);