Обновление Swing JTable - PullRequest
       1

Обновление Swing JTable

5 голосов
/ 11 ноября 2010

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

Мой сценарий таков: -

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

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

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

Ответы [ 3 ]

7 голосов
/ 11 ноября 2010

Вам нужно запустить свою работу в отдельном потоке, а затем обновить JTable в потоке графического интерфейса. Примерно так:

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
            }
        });
    }
}
2 голосов
/ 11 ноября 2010

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

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

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

0 голосов
/ 11 ноября 2010

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

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

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

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