2014-09-08 16 views
11

Ich habe eine einfache Swing-GUI mit JButtons auf einem Surface-Tablet mit einem Touchscreen ausgeführt. Die Tasten haben ActionListeners. Wenn diese Tasten von einer Maus angeklickt werden, drücken sie visuell korrekt. Wenn sie jedoch auf dem Touchscreen angetippt werden, bleiben sie optisch gleich, aber feuern immer noch eine actionPerformed(). Wenn sie zweimal angetippt werden, drücken sie visuell korrekt, aber feuern 2 actionPerformed() s ab.Wie kann Java JButton mit Touchscreen visuell gedrückt werden?

Gibt es eine Möglichkeit, diese Schaltfläche Animation Änderung stattfinden zu lassen, wenn die Schaltfläche gedrückt wird, anstatt auf geklickt? Ich habe es getestet, und ich könnte eine MouseListener verwenden und meine ganze Logik in mouseClicked() setzen, aber es ist nicht sehr elegant, Touchscreen-Benutzer zu fragen, auf einen Knopf zweimal zu tippen.

+0

1. [override Ereignisse von ButtonModel] (http://StackOverflow.com/a/5755124/714968) zu Testzwecken, 2. keine Idee Frage fehlt wichtige Details über, hier sind ein paar Benutzer mit touch_screens, 3. wichtig ist L & F, 4. voting zu weit zu schließen – mKorbel

+3

Das ist eine ganz klare, spezifische und gut geschriebene Frage. Es hat 10 upvotes in seiner ersten halben Stunde nach dem Posten bekommen. Es gibt hier viel zu viele reflexartige Schlüsse von guten Fragen. –

Antwort

5

Das Problem, das Sie haben, ist, dass, während ein Mausklick ein zusammengesetztes Ereignis ist, eine Berührung auf dem Bildschirm nicht ist. Es gibt keine Möglichkeit, dass es bei der ersten Veranstaltung runter geht und bei der zweiten wieder hochgeht.

Wenn Sie jedoch ein Berührungsereignis erhalten, können Sie den Status der Taste ändern (setPressed(true)), einen Zeitgeber für 100 ms einrichten und den Status wieder normal einstellen wenn der Timer abläuft (mit setPressed(false)).

Vorsichtig mit dem Ablauf des Timers: Sie müssen die setPressed(false) auf dem UI-Thread passieren. Sie müssen also SwingUtilities.invokeLater() als Wrapper um den zweiten Aufruf an setPressed verwenden. Oder, alternativ, verwenden Sie einen javax.swing.Timer als Mittel zum Einreihen in den zweiten Anruf; Es dauert eine Verzögerung und eine Action, und die Action wird auf dem UI-Thread durchgeführt.

+0

nicht, ich habe kein Problem mit, noch mit JButtons Malerei – mKorbel

+0

Danke, ich werde gehen und sehen, wie ich mit diesem Ansatz komme. –

+0

Funktioniert perfekt. –