Как использовать ListSelectionListener в 3-х таблицах с базой данных

Я хочу задать вопрос о слушателе выбора списка. В моем приложении у меня есть 3 Jtable, скажем, первая таблица — это таблица Student, заполненная информацией о студентах, вторая — таблица семестров, заполненная несколькими семестрами для соответствующего студента (семестр 1 до x), а последняя таблица — результат таблица, заполненная по результатам соответствующего семестра.

Что я хочу сделать, так это когда я щелкну строку в таблице студентов, таблица семестра обновит свои данные, например, она будет заполнена семестрами с 1 по 6. Затем, когда я щелкну строку в таблице семестров, таблица результатов будет обновлена это данные.

Я могу сделать это из студенческой таблицы в семестровую таблицу с помощью listselectionlistener и переопределения метода valueChanged. Но как мне сделать то же самое для семестровой таблицы для таблицы результатов? Я застреваю на этом...

  • я использую базу данных для извлечения всех значений в jtable -

отредактировано: теперь я использовал SwingWorker, но у меня есть другая проблема:

  1. Когда отображается пользовательский интерфейс, основная таблица отображает строку (это правда)
  2. Когда я пытаюсь щелкнуть эту строку, она не щелкает, я имею в виду, что обычно вы получаете фон в выбранной строке, но не со мной (неправильно-> моя проблема)
  3. Он также выдает исключение NullPointerException в моей дочерней таблице.
  4. Но когда я жду некоторое время, он внезапно снова работает...

я загрузил свой пример кода и удалил несвязанный код здесь http://dl.dropbox.com/u/67181952/mycode.java

2-й код ошибки в дочерней таблице http://dl.dropbox.com/u/67181952/spk.java

Надеюсь, я хорошо объяснил, извините за мой плохой английский.

Спасибо за любую помощь :)


person bangandi    schedule 17.05.2012    source источник


Ответы (2)


Вы можете использовать ListSelectionListener, добавленные в модели выбора, которые можно получить с помощью getSelectionModel().

Сохраняйте логику изложения, используя табличные модели. После выбора в таблице master модель/модели обновления таблиц details изменяется соответственно. В результате обновления данных модель уведомит свое представление (таблицу) об изменениях. И вид будет обновляться соответственно.

Подробнее о моделях читайте в разделе Как использовать таблицы.

ИЗМЕНИТЬ:

Поскольку вы загружаете данные из базы данных, обязательно делайте это не из потока диспетчеризации событий (EDT), чтобы избежать проблем с производительностью. Загляните в SwingWorker для выполнения длительных операций над выделенная ветка. Узнайте больше о потоках Worker и SwingWorker.

EDIT: следующая загрузка кода

Похоже, вы неправильно интерпретируете SwingWorker спецификации. execute() метод не блокирует, он планирует выполнение рабочего процесса и немедленно возвращается. Обновления пользовательского интерфейса должны выполняться в методах process() или done(), которые вызываются работником в EDT. Ниже приведена исправленная версия одной из функций из кода, который вы разместили:

public void retrieveDetailTransaction(final String noTrans){
    SwingWorker<List<TransactionDetail>, Void> worker = 
      new SwingWorker<List<TransactionDetail>, Void>() {

      public List<TransactionDetail> doInBackground() {
        List<TransactionDetail> listTransD = transDetailControl.select(noTrans);
        return listTransD;
      }

      public void done() {
        try {
           listTransDetail = get();

           transDetailModel.setListTransaction(listTransDetail);
           transactionDetailTable.setModel(transDetailModel);       

        } catch (InterruptedException ex) {
           ex.printStackTrace();
        } catch (ExecutionException ex) {
           ex.printStackTrace();
        }
      }
   };
   worker.execute();       
}
person tenorsax    schedule 17.05.2012
comment
наконец-то я могу сделать это с помощью selectionlistener, как вы упомянули выше, но мое приложение зависает, не отвечая, когда я нажимаю в 4/5 раз. Что случилось? это мое переопределенное значениеChanged if (transactionTable.getSelectionModel()==e.getSource()) { // какой-то код } else if (transactionDetailTable.getSelectionModel()==e.getSource()){ // какой-то код } - person bangandi; 17.05.2012
comment
Фильтрация @mKorbel — отличное и простое решение, если у вас есть все данные под рукой. - person tenorsax; 17.05.2012
comment
@mKorbel да, я загружаю его из базы данных - person bangandi; 17.05.2012
comment
правильно, что я понял из исходного вопроса, но комментарий ОП в вашем ответе говорит о проблеме EDT - person mKorbel; 17.05.2012
comment
@bangandi, тогда отредактируйте свой вопрос, указав эту очень важную информацию :-) - person mKorbel; 17.05.2012
comment
@Max, вы упомянули о фильтрации, я знаю, как ее использовать, поэтому я сначала загружаю все данные и продолжаю использовать ListSelectionListener, когда значение изменено, я фильтрую данные, вы это имеете в виду? - person bangandi; 17.05.2012
comment
@bangandi, сколько строк в базе данных, всего для всех трех JTables, это может быть самая важная информация о правильных предложениях, какой из способов лучше для этого - person mKorbel; 17.05.2012
comment
Фильтрация @bangandi была ответом на мой комментарий (который я отправил Максу), оставьте это в данный момент. - person mKorbel; 17.05.2012
comment
@mKorbel на данный момент, для всех, это всего 5 строк, например, но это могут быть сотни строк, может быть, тысячи, потому что я создаю приложение для транзакций для магазина. - person bangandi; 17.05.2012
comment
@bangandi вам не следует обращаться к базе данных из EDT, см. мою правку о SwingWorker. - person tenorsax; 17.05.2012
comment
@Max, теперь я использовал swingworker, но сначала, когда я пытаюсь щелкнуть строку в моей главной таблице, он возвращает исключение, и я не могу щелкнуть строку (выбранный фон не отображается), но после некоторого щелчка и щелчка , я снова получаю эту функцию, и дочерняя таблица получает обновления. Что не так с моей логикой? Я использую Swing Worker в моем методе извлечения и методе извлечения, который я вызываю внутри метода ValueChanged. - person bangandi; 17.05.2012
comment
@bangandi трудно догадаться, не глядя на код. Попробуйте составить SSCCE, иллюстрирующий проблемы. Обновите свой вопрос с помощью этого кода. - person tenorsax; 17.05.2012
comment
@Макс, здорово. Моя проблема решена большое спасибо за вас. Это мой первый раз, когда я использую SwingWorker, поэтому у меня все еще много недопонимания. но последняя проблема, например, в таблице TransactionDetail есть 2 строки. Когда я нажимаю на первую строку, которая имеет дочерний элемент, обновляется таблица spkTable. Когда я нажимаю вторую строку, которая не имеет дочернего элемента, в дочерней таблице отображается пустая строка. Это верно до тех пор, пока я снова и снова не щелкну мышью, таблица spkTable останется пустой... - person bangandi; 17.05.2012
comment
@Max, пожалуйста, посмотрите мой код в моем вопросе, извините за беспокойство - person bangandi; 17.05.2012
comment
@bangandi Реализация SPKTableModel не видна, поэтому трудно сказать наверняка. Но точно не вызывайте fireTableRowsDeleted и fireTableDataChanged явно. Сама модель будет выполнять эти методы в результате модификации данных для уведомления таблицы. - person tenorsax; 17.05.2012
comment
@Max, как вы упомянули выше, я перемещаю эти методы в spktablemodel, но, похоже, проблема не решается. Реализация SPKTableModel находится здесь dl.dropbox.com/u/67181952/spktablemodel.java - person bangandi; 18.05.2012
comment
@bangandi Похоже, вы можете просто вызвать setListSPK(listSPK) с пустым списком, чтобы очистить таблицу. Кроме того, не выполняйте spkTable.setModel(spkTableModel); в SwingWorker. Сделайте это раньше - когда будете выделять стол и модель. Затем в SwingWorker просто обновите модель. Более того, в вашем коде вы вызываете setModel на основе условия if, которое может никогда не произойти. - person tenorsax; 18.05.2012
comment
@Max Затем в SwingWorker просто обновите модель. Вы имеете в виду, что я просто вызываю setListSPK (listSPK)? Если да, я сделал точно так, как вы сказали, также я добавил fireTableDataChanged() в метод setListSPK, но предыдущая ошибка все равно произошла. Я все еще работаю над этой проблемой. Это запутанная ошибка, никакого сообщения, вообще ничего... - person bangandi; 18.05.2012
comment
@bangandi Я не уверен, что понимаю, в чем проблема, которую вы описываете. Попробуйте отладить retrieveSPK и убедитесь, что вы читаете правильные данные и что fireTableDataChanged действительно выполняется. - person tenorsax; 18.05.2012
comment
ладно, я сделаю это позже, у меня есть другая работа на сегодня, я думаю, что на сегодня мне достаточно. Ты действительно помог мне, @max, большое тебе спасибо! - person bangandi; 18.05.2012
comment
@max извините, снова беспокою вас, я делаю, как вы упоминали ранее, я так много раз отлаживал в разных местах, и я обнаружил, что в какой-то момент мой spkdao (для доступа к данным) не трогается, я имею в виду, что мое приложение не достигает строка доступа к данным. Значит ли это, что событие не обнаружено? - person bangandi; 18.05.2012
comment
я нашел кое-что, у моего приложения есть представление, модель и управление. Ошибка при достижении строки, которая вызывает контроллер, поэтому событие обнаружено, но почему-то контроллер вдруг не работает, все это... - person bangandi; 18.05.2012

Обычно я использую MouseListener (событие mouseClick) для работы с JTables. Во-первых, когда вы щелкаете в первой таблице, вы сохраняете объект, представляющий учащегося в этой строке, и сообщаете второй таблице об обновлении. То же самое будет сделано со вторым. При каждом щелчке вы сохраняете объект семестра и обновляете третью таблицу. Конечно, вы можете сделать то же самое, используя ListSelectionListener. Я думаю, вы уже делаете это, но вам нужны два разных прослушивателя событий. Один для первого и другой для второго стола.

person davidbuzatto    schedule 17.05.2012