Заполнение поля со списком в CodeNameOne

У меня возникла небольшая проблема при заполнении поля со списком из столбца базы данных. ниже мой код:

protected void initComboBoxModel(final ComboBox cmp) {

    try {
        String sql = "SELECT * FROM stockinfo";
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();

        Vector vec = new Vector();
        while (rs.next()) {
            String item = rs.getString("Parts");
            Hashtable h = new Hashtable();
            h.put("cmp", item);
            vec.addElement(h);
            cmp.setModel(new DefaultListModel(vec));
        }

    } catch (Exception ex) {
        Dialog.show("Error", "initComboBoxModel count not populate the combo box.", "OK", null);
    }
    }

Поле со списком заполняется, но в каждом параметре в поле со списком есть ненужный текст, например:

опция, которая должна говорить «Привет», говорит «{cmp = Hello}». Как мне предотвратить это? это происходит для каждого элемента в поле со списком.

Заранее спасибо:)

Марко


person Marko Vidalis    schedule 11.09.2013    source источник


Ответы (2)


Проблема, с которой вы столкнулись, заключается в том, что вы создаете Vector<HashTable>, поэтому при заполнении поля со списком средство визуализации по умолчанию использует метод toString() из каждой хеш-таблицы.

Я не знаю, зачем вам нужна хеш-таблица, но проблема в том, почему вы застряли.

Я не знаком с codeNameOne, но в Swing JComboBox по умолчанию используется средство визуализации, которое использует метод toString() для отображения данных объекта. Таким образом, вы можете создать свой собственный класс рендерера для настройки представления.

ОБНОВЛЕНИЕ

Я изменяю ваш код и код комментариев, предполагая, что вы используете java 1.5 или выше.

protected void initComboBoxModel(final ComboBox cmp) {

    try {
        String sql = "SELECT * FROM stockinfo";
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();

        Vector<String> vec = new Vector<String>(); // use generics 
        while (rs.next()) {
            String item = rs.getString("Parts");
            vec.addElement(item);            
        }

        cmp.setModel(new DefaultListModel(vec)); // here you set the model

    } catch (Exception ex) {
        Dialog.show("Error", "initComboBoxModel count not populate the combo box.", "OK", null);
    }
 }

Теперь это будет работать, вам не нужно использовать какой-либо рендерер, потому что вы добавляете строки, поэтому метод toString в этом случае подходит.

person nachokk    schedule 11.09.2013
comment
спасибо за ваш быстрый ответ, я просто немного смущен тем, как добавить это в мой код сейчас. Код, который я разместил, находится в методе, как показано ниже. Как мне включить ваш код в мой? - person Marko Vidalis; 11.09.2013
comment
защищенная пустота initComboBoxModel (окончательная cmp ComboBox) { попробуйте { String sql = SELECT * FROM stockinfo; pst = conn.prepareStatement (sql); rs = pst.executeQuery(); Вектор vec = новый вектор(); в то время как (rs.next()) { String item = rs.getString(Parts); Hashtable h = новая Hashtable(); h.put(cmp, элемент); vec.addElement(h); cmp.setModel (новый DefaultListModel (vec)); } } catch (Исключение ex) { } } - person Marko Vidalis; 11.09.2013
comment
@user2672736 user2672736 обновите вопрос, чтобы добавить правильный код с правильным отступом, я не могу догадаться, в вашем фактическом коде вы устанавливаете модель внутри цикла while, и это нехорошо. - person nachokk; 11.09.2013
comment
Я обновил код, верно, я должен установить модель в конце метода? - person Marko Vidalis; 11.09.2013
comment
Спасибо за всю вашу помощь, очень признательна :) - person Marko Vidalis; 11.09.2013
comment
Этот ответ неверен, это не вопрос Swing, это вопрос Codename One. - person Shai Almog; 12.09.2013

Это не сработает для вас на устройстве, вы изменили путь к классам, чтобы добавить JDBC, которого у вас не должно быть.

Вы должны использовать средство визуализации или MultiList, чтобы записи хеш-таблицы отображались правильно.

person Shai Almog    schedule 11.09.2013