Как успешно использовать метод Thread.sleep() в графике?

Это мой код до сих пор:

// Imported Classes
public class Timer extends Applet
{
    public void paint (Graphics page) throws InterruptedException
    {
        Thread.sleep(1000);
    }
}

Я просто хочу знать, как я могу заставить это работать. Раньше я использовал метод Thread.sleep() в другом коде, но никогда с графикой. У меня тоже нет большого опыта работы с исключениями, я обычно стараюсь избегать или исправлять их.


person xInMourning    schedule 12.05.2015    source источник
comment
Это замораживает апплет. Что ты пытаешься сделать? почему ты хочешь сделать это?   -  person Radiodef    schedule 12.05.2015
comment
Делаю таймер просто так. Он предназначен для приостановки потока, очистки экрана вызовом page.fillRect() или чего-то еще, а затем печати оставшегося времени. Но это только об Исключении.   -  person xInMourning    schedule 12.05.2015
comment
Но это просто Исключение Больше нет! Потому что ты не должен этого делать. Используйте, например. javax.swing.Timer вместо этого.   -  person Radiodef    schedule 12.05.2015
comment
Если вы не собираетесь прерывать поток самостоятельно, вы можете просто try {} catch { log.error(e); } или try {} catch { throw new RuntimeException(e); } в зависимости от вашей политики обработки ошибок. Независимо от политики, которую вы должны использовать в другом потоке (модель/контроллер).   -  person Mateusz Kubuszok    schedule 12.05.2015
comment
Также см. Игровой цикл Java (рисование) замораживает мое окно   -  person Radiodef    schedule 12.05.2015
comment
1) Зачем кодировать апплет? Если это произошло по указанию учителя, отправьте его на Почему учителя компьютерных наук должны прекратить преподавать Java-апплеты. 2) Зачем использовать AWT? См. этот ответ по многим веским причинам отказаться от AWT с использованием компонентов в пользу свинга.   -  person Andrew Thompson    schedule 14.05.2015


Ответы (1)


Вы никогда не должны вызывать такие методы, как Thread.sleep, в потоке отправки событий (т. е. в методах рисования). Это приведет к тому, что весь графический интерфейс перестанет отвечать.

Вместо этого вы должны использовать таймеры, такие как SwingTimer, для выполнения анимации и т. д. См. следующие связанные вопросы:

person aioobe    schedule 12.05.2015
comment
Спасибо. Извините, я больше привык использовать Lua, чем Java. По крайней мере, я знаю больше, чем наш учитель компьютерных наук. - person xInMourning; 12.05.2015
comment
Хе. Я понимаю. Я помню, что мне потребовалось много времени, чтобы понять всю эту штуку с потоком отправки событий. Важно понимать, что поток, который вызывает метод рисования, не является вашим, это системный поток GUI просит вас нарисовать, и вы не должны захватывать этот поток, приостанавливая его. Вы должны сделать свою картину и вернуться как можно скорее. Если вы хотите перекрашивать снова и снова, вам следует устроить так, чтобы система просила вас перекрашивать снова и снова. - person aioobe; 12.05.2015
comment
Возникли трудности с пониманием того, как использовать этот таймер. Есть ли способ, которым я могу отслеживать количество прошедшего времени? Изначально я предполагал, что это будет работать. в то время как true do { page.drawString (+ count, 50, 100); Thread.sleep(1000); считать--; если (количество ‹ 0) перерыв; } - person xInMourning; 13.05.2015
comment
да. Оставьте long startTime = System.currentTimeMillis() и используйте System.currentTimeMillis() - startTime. - person aioobe; 13.05.2015