Перерисовка и Mouselistener Java

Итак, у меня есть парадокс, когда к моему мэйнфрейму добавлен mouseListener. При вводе мыши у него есть цикл, чтобы проверить, превышает ли прошедшее время определенный предел, поэтому он регистрирует удержание. Он должен быть в потоке, потому что в противном случае я не смог бы проверить щелчки, так как мой основной поток был бы заблокирован (или нет?). Но проблема в том, что я хочу отображать информацию, пока кнопка мыши все еще нажата, требуя, чтобы я вызвал перерисовку из потока, что не будет работать, поскольку перерисовка работает только из основного потока, но это должно быть бесплатно для MouseListener ... Есть ли у кого-нибудь идеи, как решить эту проблему?

Возможный дубликат Вызов перерисовки в нескольких потоках?

Robin Green 24.11.2018 17:47

"перекраска работает только из основного потока" не соответствует действительности. paint работает только из потока диспетчера событий, но перерисовку можно использовать везде.

Robin Green 24.11.2018 17:48

Хм ... да, всякий раз, когда я пытаюсь вызвать перерисовку из потока, это не имеет никакого эффекта ...

user10699646 24.11.2018 17:53

Разместите свой код, чтобы мы могли понять, в чем проблема.

Robin Green 24.11.2018 17:56

Позвольте мне сначала попробовать решение camickrs и посмотреть, сработает ли оно для меня.

user10699646 24.11.2018 18:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
83
1

Ответы 1

When mouse entered this has a loop to check if the time that passed is exeeding a certain limit

Не используйте петлю. Если это выполняется в слушателе, вы блокируете поток отправки событий (EDT).

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

Однако вы также можете остановить таймер, если сгенерировано какое-либо другое событие, и вы хотите сбросить таймер.

Это не заблокирует Event Dispatch Thread (EDT), и события по-прежнему будут генерироваться нормально.

i want to show info while the mouse Button is still clicked

Не уверен, что означает фраза "все еще нажата". Если кнопка все еще нажата, и вы выполняете код из ActionListener, вы заблокируете EDT, и графический интерфейс не сможет перерисовать себя, пока длительная задача не будет завершена.

Прочтите раздел руководства по Swing на Параллелизм для получения дополнительной информации о EDT.

Я постараюсь это реализовать, спасибо за помощь! Что касается нажатой кнопки мыши, моя текущая настройка для этого события такова, что я устанавливаю bool в MouseListener, когда нажимаю на true. Когда предел времени превышен, функция удержания будет выполнена, если я еще не отпустил мышь, которая установила бы для bool значение false.

user10699646 24.11.2018 18:07

Итак, у вас есть таймер, который вы запускаете с события mousePressed, а затем останавливаете его с помощью события mouseReleased.

camickr 24.11.2018 18:22

Другие вопросы по теме