LINUX.ORG.RU

[java] [swing] Таймер есть ли

 ,


0

0

Может ли объект типа например JPanel выбрасывать некоторое событие спустя заданный промежуток времени. Дело в том, что не рекомендуется вызывать repaint() (да и вообще обновлять графику) у swing-объектов не в потоке событий. Но у меня есть потребность обновлять JPanel (назовем его panel) через заданный промежуток времени. Сейчас у меня в main-потоке создан бесконечный цикл c Thread.sleep(n) и panel.repaint(). Но меня не оставляет мысль, что это не правильно.

Лор, помоги.

★★★★★
Ответ на: комментарий от phoenix

Думаю это не то что мне нужно.

Может я не правильно выразился. А делаю простейшую анимацию.В общем так:


public static void main(Strings args[])
{
...
MyPanel panel;
MyFrame frame = new MyFrame();
panel= frame.getPanel();
while (true)
{

Thread.sleep(70);
panel.repaint();
}


Где на панел рисуются некоторые фигуры, например квадраты, которые обладают таким параметром как скорость. Скорост меняется:

class MyKey implements KeyListener

Который слушает события MyPanel.

Не знаю почему, но мне такая реализация не нравится, хоть я сам ее писал и она работает, поэтому пытаюсь найти более Ъ способ.

Dudraug ★★★★★
() автор топика

Там сигналов/слотов или очередей сообщений, в которую можно поместить некий евент, нет?

Amp ★★★
()
Ответ на: комментарий от Amp

Немного не понял вопроса... Где там?

Вообще у меня, как я уже сказал выше, объект MyPanel выбрасывает некоторые некоторые действия при их наступления, есть класс который подписан на нажатия клавиш клавиатуры. По этим нажатиям я изменяю некий объект (тот что двигается), точнее показатели его скорости. Это все происходит в потоке swing. А отрисовка (повторная) вызывается в основном потоке. Как бы все бы хорошо, но я читал что такой подход не рекомендуется. Было бы просто идеально если бы JPanel мог выбрасывать события по прошествии интервала времени.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Хотя в принципе пока и в main() все работает. Цикл отрисовки точно нельзя пихать в поток событий ибо... ничего хорошего не выйдет, прога просто повиснет. Оставляю пока как есть, по идее сложностей быть не должно.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

> Дело в том, что не рекомендуется вызывать repaint() (да и вообще обновлять графику) у swing-объектов не в потоке событий

где написано? Насколько я помню, repaint просто ставит в очередь соотв. event, а обрабатывается он уже в правильном потоке.

Что мешает делать расчеты в отдельном thread-е и из него делать panel.repaint()

phoenix ★★★★
()
Ответ на: комментарий от phoenix

Хорошо, значит я не совсем корректно понял то что читал. Спасибо.

Dudraug ★★★★★
() автор топика

Да вроде в таких случаях обычно используют что-то вроде javax.swing.Timer, а не свои уведомления городят, разве нет?

alexsaa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.