Java из-за нехватки памяти выдается при инициализации полей со списком - PullRequest
1 голос
/ 13 февраля 2010

Это мой код, здесь переменная bq - это пользовательский класс с именем BasicQuery, который возвращает соединение JavaDB ... AutoCompleteDecorator - это класс из библиотеки swingX, используемый для реализации функций автозаполнения ... Этот код запускается примерно 3 раза правильно но после этого он продолжает зависать и через некоторое время выдает исключение нехватки памяти! Я не могу найти, где проблема. Кто-нибудь может мне помочь, пожалуйста! Также, если вам нужны другие части кода, пожалуйста, дайте мне знать!

</p> <pre><code>private void initCombos() { ResultSet r=bq.executeQuery("select productID,productName from products"); cmbProductID.removeActionListener(this); cmbProductID.removeActionListener(this); try { cmbProductID.removeAllItems(); cmbProductName.removeAllItems(); cmbCodes.removeAllItems(); String s1; while(r.next()) { s1=r.getString(1).trim(); cmbProductID.addItem(s1); cmbCodes.addItem(s1); cmbProductName.addItem(r.getString(2).trim()); } r.close(); cmbProductID.addActionListener(this); cmbProductName.addActionListener(this); AutoCompleteDecorator.decorate(cmbProductID); AutoCompleteDecorator.decorate(cmbProductName); } catch(Exception x) { JOptionPane.showMessageDialog(this,"Error setting up ComboBoxes "+x); } }

Ответы [ 2 ]

2 голосов
/ 13 февраля 2010

Есть две проблемы, которые я вижу. @ Ник Карвер указал один (+1). Если вы не удалите ActionListener из cmbProductName, как вы, несомненно, предполагали, вы будете распространять события действия из этой комбинации на каждой итерации по ResultSet.

Во-вторых, вы, кажется, делаете тяжелую работу в своей картине. Как правило, ваши вызовы БД должны выполняться в рабочем потоке, а в потоке рисования должны выполняться только те задачи, которые рисуют графический интерфейс. В противном случае вы будете блокировать этот поток, и ваше приложение будет чувствовать себя вялым. Посмотрите SwingWorker и концепции параллелизма в Swing для получения дополнительной информации по этой теме .

2 голосов
/ 13 февраля 2010

В этом разделе:

ResultSet r=bq.executeQuery("select productID,productName from products");
cmbProductID.removeActionListener(this);
cmbProductID.removeActionListener(this);

Я думаю, вы имеете в виду:

ResultSet r=bq.executeQuery("select productID,productName from products");
cmbProductID.removeActionListener(this);
cmbProductName.removeActionListener(this);

В противном случае на cmbProductName остается открытым обработчик событий, который приведет к утечке памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...