Почему мой курсор ожидания иногда не отображается при обновлении данных в JTable? - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть JTable, который будет перезагружать отсортированные данные из базы данных, когда пользователь нажимает на заголовок столбца. MainView (JFrame) содержит элементы графического интерфейса, которые создадут новый SwingWorker и запустят его. Функция doInBackGround () SwingWorker меняет курсор MainView на курсор ожидания. Затем, когда функция doInBackground () завершает свою работу и, прежде чем покинуть функцию doBackground, она меняет курсор на курсор по умолчанию.

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

Почему курсор иногда показывает, а не другие? Есть ли особый способ, которым я должен установить курсор ожидания? Должен ли я установить курсор ожидания из потока SwingWorker или из потока графического интерфейса MainView?

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

Вы должны установить курсор ожидания перед задним фоном. Я сделал это в конструкторе класса рабочего потока или прямо перед вызовом execute. Вам нужно вернуть курсор в нормальное состояние в готовом методе. Это, вероятно, где ваша проблема. Метод done выполняется в потоке диспетчеризации событий, который должен использоваться для обновлений пользовательского интерфейса.

Не обновляйте компоненты графического интерфейса из метода doinbackground, иначе вы увидите такой тип поведения. Я этого не знал и сделал то же самое, что и вы. Это может сбивать с толку.

0 голосов
/ 18 февраля 2012

Со страницы Oracle Swing Concurrency :

Код обработки событий Swing выполняется в специальном потоке, известном как поток диспетчеризации событий.Большая часть кода, который вызывает методы Swing, также выполняется в этом потоке.Это необходимо, поскольку большинство методов объекта Swing не являются «поточно-ориентированными»: их вызов из нескольких потоков может привести к возникновению помех в потоке или к ошибкам согласованности памяти.doInBackground() метод:

Вычисляет результат или выдает исключение, если не может этого сделать.

Затем он используется работником для выполнения некоторых задач, выполняяв рабочем потоке.

и о методе done():

Выполняется в потоке диспетчеризации событий после завершения метода doInBackground.Реализация по умолчанию ничего не делает.Подклассы могут переопределить этот метод для выполнения действий завершения в потоке диспетчеризации событий.Обратите внимание, что вы можете запросить статус внутри реализации этого метода, чтобы определить результат этой задачи или то, была ли эта задача отменена.

Обычно она используется для отображения окончательных результатов после doInBackground()завершает свою работу.

Затем, я думаю, вы должны установить курсор на метод doInBackground() SwingWorker, используя такой код:

public Void doInBackground() {
     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
...
}

и отключить его на метод done() SwingWorker,с:

public void done() {
 setCursor(Cursor.getDefaultCursor());
 ...
}

Вы можете найти другую информацию об этих методах курсора в API класса Cursor .

Здесь страница с некоторым занятымпримеры кода курсора, здесь SO вопрос, связанный с курсором.

0 голосов
/ 18 февраля 2012

Возможно, вы захотите, чтобы ваш jtable сортировал данные вместо повторного вызова базы данных.Это довольно легко настроить. таблица сортировки

...