Как отобразить анимацию в ячейке JTable - PullRequest
9 голосов
/ 23 февраля 2009

Я ищу способ отображения анимированного индикатора прогресса (анимированный GIF, вращающееся колесо, отображаемое через Java2D и т. Д., Здесь нет предпочтений) в ячейке таблицы до тех пор, пока не будет вычислено или получено значение, которое должно быть окончательно отображено. .

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

Со статической меткой или изображением это работает нормально, но поскольку рендеринг ячейки использует это только как своего рода штамп и не создает отдельных экземпляров на ячейку (что, конечно, является хорошей идеей с точки зрения производительности), анимированный GIF например, не «играет» в отдельных ячейках.

Как мне добиться такого эффекта? Это сделало бы более «отточенный» интерфейс, чем простой текст.

Ответы [ 2 ]

6 голосов
/ 23 февраля 2009

Сначала я пришел к той же идее, что и Ник Фортескью (Метод 2). Однако сразу после этого я наткнулся на

Блог о кроличьей норе

, где автор предоставляет очень полезные классы для анимированных значков (на основе GIF), а также нарисованный Java2D индикатор бесконечного прогресса (знаменитый Mac OS X, как вращающееся колесо), который я мог просто вставить в свое приложение, не беспокоясь Я слишком много рисую.

Однако, если бы я не нашел их, Ник бы так и поступил.

2 голосов
/ 23 февраля 2009

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

Метод 1 - JLayeredPane

Если бы мне нужно было сделать это, я бы использовал JLayeredPane , чтобы рисовать мои анимированные средства визуализации поверх JTable.

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

JScrollPane -> (Viewport) JLayeredPane -> JTable & JPanel (прозрачный, с анимацией)

У вас также будет непростая задача по созданию нашей панели для анимации, вам потребуется либо собственный менеджер макета для зеркального отображения ширины столбцов JTable, либо использование чего-то вроде GridLayout. Выполнимо, но много работы.

Method2 - пользовательский CellRenderer и перерисовка в Swing Timer

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

...