Как заполнить JComboBox из ArrayList

Я пытаюсь получить некоторые значения из базы данных MySQL в JComboBox, используя ArrayList и DefaultComboBoxModel, чтобы избежать получения повторяющихся значений. Потому что JComboBox продолжает снова и снова вводить одни и те же значения в JComboBox, когда я вызывал метод для выборки значений.

В настоящее время, когда следующий код запускает поле со списком, отображаются такие значения,

sometext@24084, sometext@716a1

Вот мой код,

public static void loadAll(JComboBox comboBox) {
        try {
            ArrayList<Combo> comboList = ComboBoxController.getComboType();
            DefaultComboBoxModel dtm = (DefaultComboBoxModel)comboBox.getModel();

            for (Combo combo : comboList) {
                Object[] rowData = {combo.getComboType()};
                dtm.addElement(rowData);
            }
        } catch (SQLException | ClassNotFoundException ex) 
        {
            Logger.getLogger(AllComboBoxMethod.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

И метод извлечения,

int itemCount = combo.getItemCount(); 

for(int i = 1; i < itemCount; i++) { 
    combo.removeItemAt(0); 
}

String sql = "SELECT * FROM combo_type";
dbConnection = DbConnection.getInstance();
con = dbConnection.getConnection();
stm = con.createStatement();
rst = stm.executeQuery(sql);

ArrayList<Combo> comboList = new ArrayList();
while(rst.next()) {
     comboList.add(new Combo(rst.getString(2)));
}
return comboList;

Так что я делаю неправильно? Это единственный способ избежать получения повторяющихся значений? Я пробовал comboBox.removeAllItems() ранее (до добавления этого кода), а затем извлекал значения. Но это дает мне NullPointerException несколько раз. Итак, как я могу это исправить?

Не могли бы вы уточнить, какую проблему вам нужно решить? Это только для представления String?

LppEdd 23.03.2019 19:53

@LppEdd В основном мне нужно избегать получения повторяющихся значений при повторном вызове метода выборки JComboBox.

Hasitha Jayawardana 23.03.2019 19:55

Где этот метод "выборки"?

LppEdd 23.03.2019 19:56

@LppEdd Я обновил свой вопрос.

Hasitha Jayawardana 23.03.2019 20:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот

sometext@716a1

— уникальный идентификатор/адрес памяти конкретного экземпляра класса.
Вы видите это, потому что вы неправильно переопределили

public String toString();

метод для класса Combo.


Кроме того, DefaultComboBoxModel — это общий включенный класс.

DefaultComboBoxModel<E>

так почему вы используете необработанный экземпляр?
Вы должны иметь дело с

DefaultComboBoxModel<Combo>

вместо. Это означает, что вы могли бы сделать

for (final Combo combo : comboList) {
   dtm.addElement(combo);
}

Попробуйте с

public static void loadAll(final JComboBox comboBox) {
    try {
        final List<Combo> comboList = ComboBoxController.getComboType();
        final DefaultComboBoxModel dtm = (DefaultComboBoxModel) comboBox.getModel();

        dtm.removeAllItems();

        for (final Combo combo : comboList) {
            dtm.addElement(combo.getComboType());
        }
    } catch (final SQLException | ClassNotFoundException ex) {
        Logger.getLogger(AllComboBoxMethod.class.getName()).log(Level.SEVERE, null, ex);
    }
}

int itemCount = combo.getItemCount();

for (int i = itemCount - 1; i >= 0; i++) { 
   combo.removeItemAt(0); 
}

разве это не дубликат габиллиона подобных вопросов?

Hovercraft Full Of Eels 23.03.2019 19:51

@HovercraftFullOfEels ммм, я пытаюсь понять, пытается ли он решить только проблему «toString» или есть нечто большее.

LppEdd 23.03.2019 19:52

Я попробовал overriding toString метод. Он показывает мне Java.Lang.Object;@546 вот так.

Hasitha Jayawardana 23.03.2019 19:57

@HasithaMJayawardana Показывает ли это как [Ljava.lang.Object; @ 60438a68 ? С [L впереди?

LppEdd 23.03.2019 20:01

@LppEdd Да L там

Hasitha Jayawardana 23.03.2019 20:01

@HasithaMJayawardana попробуйте код, который я разместил в своем ответе.

LppEdd 23.03.2019 20:04

@LppEdd dtm.removeAllItems(); дает мне NullPointerException несколько раз.

Hasitha Jayawardana 23.03.2019 20:08

@HasithaMJayawardana, потому что вы не связали ComboBoxModel с JComboBox, поэтому, когда вы его извлекаете, он равен нулю

LppEdd 23.03.2019 20:10

@LppEdd Как я могу это сделать? Потому что мне нужно сохранить значение по умолчанию.

Hasitha Jayawardana 23.03.2019 20:11

@HasithaMJayawardana с помощью конструктора JComboBox или setModel. См. документацию docs.oracle.com/javase/7/docs/api/javax/swing/JComboBox.html

LppEdd 23.03.2019 20:11

есть ли способ сохранить первый элемент и удалить все остальные? Я пробовал с for loop. Но не сработало.

Hasitha Jayawardana 23.03.2019 20:13

@HasithaMJayawardana использует цикл for с индексом, начинающимся с 1, и использует метод DefaultComboBoxModel#removeElementAt или JComboBox#removeItemAt

LppEdd 23.03.2019 20:14

@LppEdd Я пробовал, но не получилось. Я попробовал это int itemCount = combo.getItemCount(); for(int i = 1; i < itemCount; i++) { combo.removeItemAt(0); }

Hasitha Jayawardana 23.03.2019 20:24

@HasithaMJayawardana подожди, я пойду поужинаю, тогда мы сможем лучше видеть. Опубликуйте весь свой обновленный код

LppEdd 23.03.2019 20:27

Другие вопросы по теме