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




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.
Итак, у вас есть таймер, который вы запускаете с события mousePressed, а затем останавливаете его с помощью события mouseReleased.
Возможный дубликат Вызов перерисовки в нескольких потоках?