2010-11-11 3 views
5

Я работаю над проектом в качаниях и тем, что добавляю строки в JTable в цикле while.Обновление Swing JTable

Мой сценарий заключается в следующем: -

Как только пользователь нажимает кнопку программа входит в то время как() цикл и начать добавлять строки к DefaultTableModel из JTable один за другим, пока цикл завершается в то время. Но дело в том, что таблица обновляется данными только после окончания цикла while. Я хочу, чтобы он обновлялся после добавления каждой строки и показывал ее в пользовательском интерфейсе.

Было бы очень хорошо, если бы кто-то может помочь мне с этим обеспечить решение

Я уже пытался перекрасить() после добавления каждой строки, но это не сработало.

+0

Как долго ваш цикл занимает? –

ответ

7

Вам нужно запустить свою операцию в отдельном потоке, а затем обновить JTable в потоке gui. Что-то вроде этого:

public void someButtonClicked(params...) { 
    new Thread(new Runnable() { 
     public void run() { 
      longOperation(); 
     } 
    }).start(); 
} 

public void longOperation() { 
    for(int i=0; i<1000; i++) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // add new row to jtable 
      } 
     }); 
    } 
} 
+0

Спасибо, Герко, что вы спасли мой день, теперь его работа – Jinith

+0

благодарит за ваше время и усилия - ценится – Jinith

0

Если весь цикл while работает в потоке отправки событий Swing в ответ на событие нажатия кнопки, поток не будет бесплатным для обновления представления на экране, пока ваш код обработки событий не завершится (конец вашего actionPerformed method).

Я не уверен, что вы пытаетесь сделать здесь - возможно, анимация? Вы можете использовать Swing's Timer class (javax.swing.Timer) для повторного запуска события с небольшой задержкой между стрельбой, и в ответ на каждое событие вы можете добавить строку в таблицу. Пока ваш код обработки событий быстро выходит из строя в ответ на каждое событие, Swing должен иметь возможность перерисовывать представление между событиями. Вам действительно нужно хорошо разбираться в потоковой модели Swing, или эти проблемы действительно запутывают. Это не слишком сложно - есть хорошие ресурсы для чтения, если вы ищете, например, «Качание событий».

Re: вызов repaint() - это не будет работать как repaint(), а другие методы, такие как validate() и т. Д., Будут только отмечать компонент, который должен быть перекрашен - компонент на самом деле не будет перерисовываться на экране, пока Swing не получит шанс сделать это, и если вы поймаете поток Swing в цикле while, он не будет свободен делать картину до тех пор, пока вы не закончите цикл, а код обработки событий не закончится.

2

Думаю, вам стоит часто обновлять строку. Существует учебник, который дает солнце, называемое «Рождественская елка». Вот ссылка для этого

http://java.sun.com/products/jfc/tsc/articles/ChristmasTree/

Выше ссылка поможет вам для часто обновлять строки в JTable.

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