Приостановить цикл, но все равно можно будет увидеть текст - PullRequest
1 голос
/ 09 января 2012

У меня проблема.Я рисую что-то, используя цикл, и использую Sleep, чтобы приостановить выполнение.В то же время я хочу видеть, что находится в текстовой области, которая имеет много строк, и мне нужно прокрутить вниз, чтобы увидеть их. Но я не могу. С помощью сна это невозможно.Какие-либо предложения?Спасибо.

Ответы [ 4 ]

1 голос
/ 09 января 2012

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

Типичный вариант использования с пользовательским интерфейсом состоит в том, чтобы выполнять тяжелую работу в рабочем потоке (как, например, предоставляемый классом SwingWorker) и обновлять свой пользовательский интерфейс, когда работа выполнена (или через определенные интервалы для отображения прогресса ).

Если вы хотите выполнить некоторый код через определенные интервалы, вы используете Timer (вариант Swing, а не версия java.util), который выполнит свой код в правильном потоке и освободит поток пользовательского интерфейса между двумя казни.

1 голос
/ 09 января 2012

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

Учебное пособие: Как использовать Swing Timers

Редактировать 1
Примечание: здесь есть много рекомендаций по использованию SwingWorker, и они могут быть полезны, но я бы воздержался от их использования, если только код, который необходимо сделать между промежутками времени, не сильно загружает процессор и занимает немного времени, например, чтение в среднем или большом файле. Если все, что вы делаете - это рисуете круг, затем делаете паузу, а затем рисуете другой круг, SwingWorker - это излишнее излишество, и снова вам нужно использовать Swing Timer, который гораздо проще реализовать.

Как и во всех рекомендациях, ответы будут зависеть от специфики вашей проблемы, и вы можете рассказать нам больше.

0 голосов
/ 09 января 2012

К сожалению, вы не опубликовали ни одного фрагмента кода и не объяснили четко, что означает, что вы не можете прокрутить текстовую область вниз.

Но я могу предположить, что ваш пользовательский интерфейс заморожен, потому что вы вызываете sleep() в потоке пользовательского интерфейса. Возможно, он вызывается из вашего перегруженного paint() или repaint() метода? Если мое предположение верно, попробуйте сделать ваш цикл и спать из отдельного потока. Вы, вероятно, можете использовать SwingWorker.

Чтобы дать вам более конкретные рекомендации, мне нужно больше информации.

0 голосов
/ 09 января 2012

Вам нужно будет в основном запомнить состояние цикла (куда вы попали и т. Д.) И прекратить добавление. Позвольте пользователю прокрутить список, и когда вы захотите «снять паузу», возобновите цикл с того места, куда вы попали.

В качестве альтернативы, выполните зацикливание в отдельном потоке, используя соответствующие вызовы SwingWorker и т. Д., Чтобы выполнить маршалинг обратно в поток пользовательского интерфейса, чтобы повлиять на пользовательский интерфейс, а затем перейти в спящий режим в другом потоке. Это не повлияет на пользовательский интерфейс. Это, вероятно, станет довольно беспокойным.

...