2012-04-03 4 views
0

EDIT (NEW):Populate выпадающий с таблицей значений

До сих пор не выяснили, как заполнить cboxCustomers. Я был на нем в течение дня или двух, но без везения.

В случае, если кто может помочь: http://pastebin.com/e5wibRYw

Я пошел от cats к customers, кстати.

Я пробовал Mr. Xymon's подход, но не реализовал его правильно, так как он не работал.

Независимо от того, какое событие я использовал для обработки населения, я всегда получал NullPointerException для любого контроля/события, которое я пытался использовать.

OLD:

Там в JForm. На нем есть один комбинированный блок. Также есть один стол с кошками - cats. Каждый кот имеет id и catName.

То, что я хотел сделать, когда я нажимаю на поле со списком, тем самым расширяя его, заполнить его со всеми id кошек, которые находятся в cats таблице.

СЛОВАРЬ. Asnwer ниже. К сожалению, я получаю многочисленные unreported exception java.sql.SQLException от линий я обозначенных >:

private void cboxCatsMouseClicked(java.awt.event.MouseEvent evt) { 
     // TODO add your handling code here: 
     // create an array list to be filled with cat's ids 
     ArrayList<String> cats = new ArrayList<String>(); 
     String query = "SELECT id FROM cats ORDER BY id"; 
     >java.sql.PreparedStatement stm = connection.prepareStatement(query); 

     >ResultSet rs = stm.executeQuery(query); 

     >while(rs.next()){ 
      >String cat = rs.getString("id"); 
      // add cat's ids tp the array list 
      cats.add(cat); 
     } 

     >rs.close(); 

     // populate the combo box 
     DefaultComboBoxModel model = new DefaultComboBoxModel(cats.toArray()); 
     cboxCats.setModel(model); 
    } 

OLD ОТВЕТ:

Я думаю, что я установил его. Мне просто пришлось обернуть все выделенные строки кода вместе в один большой оператор try-catch, который поймал бы SQLException. Проблема в том, что поле со списком не заполняется значениями id, когда я его расширяю. Почему это? Я использую неправильное событие?

+1

Опубликовать полный текст исключения пожалуйста. Также вы захотите выполнить любые запросы базы данных в фоновом потоке, таком как объект SwingWorker. –

+2

Что касается вашего редактирования: снова вам нужно выполнить все запросы базы данных в фоновом потоке. Почему вы пытаетесь заполнить combobox на mouseClick, поскольку это не имеет никакого смысла. Потребуется время, чтобы запросить базу данных, и это, вероятно, будет бесполезно с возможностью Swing открыть поле со списком. Почему бы не заполнить поле со списком заранее? –

+0

Да. Это имеет больше смысла. Благодарю. – Bob

ответ

2

Не лучше заполнить поле со списком с именем кошки вместо идентификатора? Я придумал другое решение, просто добавив значение поля в модель вместо использования ArrayList. Вы должны выполнить его внутри конструктора, чтобы заполнить поле со списком при загрузке формы.

DefaultComboBoxModel list = new DefaultComboBoxModel(); 
JComboBox cbo_cats = new JComboBox(list); 


// at constructor or a user-defined method that's called from constructor 
    try{  
     // assume that all objects were all properly defined 
     s = con.createStatement(); 
     s.executeQuery("SELECT * FROM cats ORDER BY catName"); 
     rs = s.getResultSet(); 
     while(rs.next()){ 
     //int id = rs.getInt("id"); 
     //list.addElement(id); 

     String c = rs.getString("catName"); 
     list.addElement(c); 
     } 
    }catch(Exception err){ 
     System.out.println(err); 
    } 

Как вы можете видеть, я не использовал подготовленные заявления, но вы можете легко изменить это.

+0

Хм. Единственная проблема, которую я вижу в этом, заключается в том, что поле со списком заполняется только при загрузке формы. В моей программе есть вкладки.Таким образом, первая вкладка позволяет пользователю просматривать данные о каждой кошке, обновлять конкретную кошку, удалять и добавлять новую. Вторая вкладка содержит поле со списком. Итак, скажем, форма загружена, заполнил поле со всеми уже существующими кошками, используя ваш путь. Теперь, что, если я иду и создаю новую кошку, обновляю существующую или удаляю ее на первой вкладке моего приложения. Это изменит таблицу в базе данных, что означает, что поле со списком будет содержать устаревшую информацию. Что я могу сделать по этому поводу? – Bob

+1

Для этого есть средство. Создайте метод, скажем, fetchCategory(), который содержит коды для заполнения поля со списком. Это тот же метод, который вы собираетесь вызвать из конструктора. То, что вам нужно добавить в начале, - это код, который удаляет все элементы из поля со списком с помощью объекта DefaultComboBoxModel, который в моем примере я назвал его списком. Итак, это будет так: list.removeAllElements(); Наконец, просто вызовите метод fetchCategory(); после выполнения каждой операции категории, такой как обновление, удаление, вставка. Это должно обновить содержимое вашего поля со списком. –

+0

Для 'fetchCategoty()', вы имели в виду что-то вроде этого - http://pastebin.com/JHH0yLhD Игнорируйте путаницу между 'cats' и' customers' – Bob

Смежные вопросы