Как заполнить данные в JComboBox?

1

Я создал графический интерфейс и имею базу данных, расположенную снаружи, в которой я извлекаю данные. Для этого я использую построитель 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 секунда)

Теги:
netbeans
jdbc
jcombobox

3 ответа

2
Лучший ответ

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);
  • 0
    1- Это делает лучший комментарий; 2- Vector обычно не рекомендуется в пользу List и даже в многопоточной среде Collections.synchronizedList как правило, является предпочтительным механизмом.
  • 0
    Я прожил свою жизнь ложью !! Черт ... Мой учитель сказал мне, чтобы я всегда использовал Вектор ... Не могли бы вы пояснить, почему Вектор не рекомендуется в пользу списка?
Показать ещё 16 комментариев
3

Возможно, ваш запрос 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
    
  • 0
    Вам нужно указать параметр ( '?' )?
  • 0
    Пробовал все это, но, к сожалению, это не сработало. Двойные кавычки работают для операторов SQL. Я сделал много других, и все они работали нормально, но я действительно заполнил JTables и текстовые поля, и это первый раз, когда я пытаюсь заполнить JComboBox.
Показать ещё 2 комментария
3

При попытке динамического добавления элементов в поле со списком используйте 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

  • 0
    Право, когда сделал system.out на этом и проверил значение каждой позиции индекса jcombobox. Значения успешно напечатаны. Однако теперь проблема заключается в том, что я на самом деле вижу их, когда я запускаю графический интерфейс и когда я нажимаю на выпадающий список, и я не могу видеть значения там. JComboBox пуст. : S
  • 0
    Попробуйте использовать это и посмотрите, что происходит
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню