Я создал графический интерфейс и имею базу данных, расположенную снаружи, в которой я извлекаю данные. Для этого я использую построитель GUI в NetBeans. Кто-нибудь знает простой способ для заполнения 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);
}
Хорошо (Update), запрос распечатывает результаты:
run:
Стандарт путешествия Фиксированный стандарт СТРОГО УСПЕШНОЕ (общее время: 1 секунда)
EDIT: Это ваша основная ошибка.. вы вызываете метод в 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);
Возможно, ваш запрос SELECT
не возвращает никаких результатов. Чтобы убедиться в этом, вы можете добавить while (rs.next())
цикл while (rs.next())
. Мои знания SQL немного ржавые, но я помню, используя '
(одинарные кавычки) для строковых литералов, тогда как вы используете "
(двойные кавычки) в своем заявлении.
Кроме того, я вижу несколько вещей, которые могут вызвать проблемы:
Код SQL для PreparedStatement
не должен создаваться путем конкатенации строк. Вместо этого используйте ?
для значений параметров, которые будут заменены в инструкции, например
stmt = con.prepareStatement("SELECT Name FROM Discount WHERE Type = ?");
stmt.setString(1, type); // first (and only) parameter
rs = stmt.executeQuery();
Настоятельно рекомендуется явно закрыть ресурсы JDBC после их выполнения. Для этого вам нужно добавить блок finally
после catch (SQLException...)
, например
} 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
Vector
обычно не рекомендуется в пользуList
и даже в многопоточной средеCollections.synchronizedList
как правило, является предпочтительным механизмом.