Проблема Java Swing Threading - PullRequest
       3

Проблема Java Swing Threading

0 голосов
/ 23 июня 2011

так вот в чем проблема. У меня есть окно JDialog, которое состоит из 3 полей со списком, текстовое поле, несколько кнопок и JTable. Информация JTable фильтруется на основе текстового поля и полей со списком, поэтому, например, она начинается со всех данных и сокращается до тех данных, которые начинаются с любого строкового значения, которое решит пользователь.

Что происходит, так это то, что хотя значения фильтруются правильно, если я щелкаю в JTable (в пустом пространстве, где нет строк), то удаляемые строки отображаются, как будто они были невидимы, пока я не нажал на них , Я попробовал почти все: Я пытался воссоздавать таблицу каждый раз, когда нажимал фильтр (плохой хак, который даже не работал), я вызывал все методы перерисовки, повторной проверки, перезапуска, я переписывал диалог с нуля, чтобы убедиться, что я не сделал этого. не делайте глупых ошибок (если я сделал одну, я не нашел ее по крайней мере), и я попытался поместить их в отдельные темы. Единственное исправление, которое я не пробовал, - это использование работника свинга, но это потому, что моя фильтрация была слишком сложной для меня, чтобы понять, что и куда и как правильно расширить работника свинга. GUI генерируется netbeans (bleh), и работал в моей другой дюжине или около того JDialogs просто отлично (на самом деле идеально). Вот метод, который делает фильтрацию, если кто-то из вас может помочь, он будет очень признателен.

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        nameFilter = "task1";
        javax.swing.table.DefaultTableModel dm = (javax.swing.table.DefaultTableModel)jTable1.getModel();


       tempParameters = parameters;
       String currentString;
       int rowNumber = 0;
       while (dm.getRowCount()>rowNumber){
           currentString = (String)(jTable1.getValueAt(rowNumber,1));
           if(!nameFilter.equalsIgnoreCase(currentString.substring(0,nameFilter.length()))){
               dm.removeRow(rowNumber);
               parameters--;
           }
           else rowNumber++;
       }
       parameters = numOfRows;
}

Обновление, я также применил фильтр из комментария ниже, и хотя он отфильтровывал правильные данные, у него была точно такая же проблема. В будущем я, вероятно, буду использовать эту функцию фильтра, так что спасибо.

Еще одно обновление, код по-прежнему не работает даже после удаления всего, кроме этого фрагмента, и все (по крайней мере, я верю ..), что я делаю здесь, выполняет простой вызов удаления строки. Надеюсь, это немного поможет.

Ответы [ 3 ]

0 голосов
/ 23 июня 2011

Пока этот метод вызывается из EDT, я не думаю, что возникнет проблема с многопоточностью. Попробуйте использовать

SwingUtilties.isEventDispatchThread()

чтобы убедиться.

Если вы посмотрите на API для DefaultTableModel, обновления отправляются на ваш JTable, который перекрашивается сам, поэтому я не думаю, что это проблема.

Я бы предположил, что это логическая проблема. Если вы сможете извлечь логику в отдельные методы, вам будет проще протестировать и проверить, обновляет ли она модель, как вы ожидаете.

0 голосов
/ 23 июня 2011

Пара наблюдений:

Если фильтр окажется больше, чем содержимое строки в строке, он сгенерирует вызов подстроки Вызов dm.removerow генерирует кучу событий, удаленных из таблицы. Вы запрашиваете количество строк из модели, но получаете значение через таблицу (немного противоречиво, если модель оборачивается вокруг другой модели, которую вы можете использовать для разных строк), поэтому вместо jtable1.getvalueat , используйте dm.getvalueat.

Я думаю, что может происходить то, что когда события запускаются, я вижу, что в JTable происходят события перерисовки и повторной проверки, они могут растоптать друг друга, поскольку они ставятся в очередь в EDT.

Я бы предложил создать новую модель данных, добавить строки, которые вы хотите сохранить, а затем переназначить их в jTable1.setModel (newDm);

Также нужно следить за тем, не изменяет ли кто-либо модель, пока вы находитесь в вашем списке событий. * * 1010

Надеюсь, это поможет

0 голосов
/ 23 июня 2011

Пытались ли вы создавать новую модель каждый раз, когда вы хотите фильтровать, вместо того, чтобы очищать ее, удаляя строки?Создайте новую модель, скопируйте соответствующие строки в новую модель, установите новую модель в таблицу.На самом деле это не обязательно, но это может быть быстрое решение.

Кроме того, мне действительно интересно, почему вы вызываете toLowerCase для двух строк, когда вы используете equalsIgnoreCase для их сравнения.

...