Как заставить Java JButton визуально подавлять сенсорный экран?

У меня есть простой графический интерфейс Swing с JButtons, который запускается на планшете Surface с сенсорным экраном. Кнопки имеют ActionListeners. Когда эти кнопки нажимаются с мыши, они визуально подавляют правильно. Однако, когда они прослушиваются на сенсорном экране, они остаются визуально одинаковыми, но при этом погаснет actionPerformed(). Если они двойные, то они визуально нажимают правильно, но срабатывают 2 actionPerformed() s.

Есть ли способ, чтобы изменить эту кнопку, когда кнопка нажата, а не нажата? Я протестировал его, и я мог использовать MouseListener и поместить всю свою логику в mouseClicked(), но не очень элегантно просить пользователей сенсорного экрана дважды нажать кнопку.

Ответ 1

Проблема заключается в том, что в то время как щелчок мыши представляет собой сложное событие, сенсорного экрана нет. Таким образом, нет способа, чтобы он мог опуститься на первое событие и снова на втором.

Но то, что вы можете сделать, когда вы получаете событие касания, - это изменение визуального состояния кнопки, чтобы оно выглядело подавленным (используя setPressed(true)), затем установите таймер на 100 мс или около того и установите состояние обратно на нормальный, когда таймер истекает (используя setPressed(false)).

Осторожно с истечением таймера: вам нужно, чтобы setPressed(false) произошел в потоке пользовательского интерфейса. Поэтому вам нужно использовать SwingUtilities.invokeLater() в качестве обертки вокруг второго вызова setPressed. Или, альтернативно, используйте javax.swing.Timer как средство очередности второго вызова; он принимает задержку и Action, а Action выполняется в потоке пользовательского интерфейса.