2014-09-08 20 views
11

Ho una semplice GUI Swing con JButtons in esecuzione su un tablet Surface con touchscreen. I pulsanti hanno ActionListeners. Quando questi pulsanti vengono cliccati da un mouse, si visualizzano visivamente correttamente. Tuttavia, quando vengono toccati sul touchscreen rimangono visivamente gli stessi, ma continuano a sparare un actionPerformed(). Se vengono toccati due volte, visualizzano correttamente la pressione ma attivano 2 actionPerformed() s.Come rendere Java JButton visivamente deprimente con il touch screen?

C'è un modo per ottenere che questa modifica dell'animazione del pulsante avvenga quando si preme il pulsante anziché fare clic su? L'ho provato e potrei usare uno MouseListener e mettere tutta la mia logica in mouseClicked() ma non è molto elegante chiedere agli utenti di touchscreen di toccare due volte un pulsante.

+0

1. [sovrascrivere eventi da ButtonModel] (http://stackoverflow.com/a/5755124/714968) a scopo di test, 2. nessuna domanda di idea con dettagli importanti mancanti, ecco alcuni utenti con touch_screens, 3. importante è usato L & F, 4. voto per chiudere come troppo ampio – mKorbel

+3

Questa è una domanda perfettamente chiara, specifica e ben scritta. Ha ottenuto 10 upvotes nella prima mezz'ora dopo la pubblicazione. C'è * molto * troppa chiusura di buone domande qui intorno. –

risposta

5

Il problema è che mentre un clic del mouse è un evento composto, un tocco sullo schermo non lo è. Quindi non c'è modo che possa scendere al primo evento e risalire al secondo.

Ma ciò che si può fare, quando si riceve un evento tattile, è modificare lo stato visivo del pulsante in modo che apparisca premuto (usando setPressed(true)), quindi impostare un timer per 100ms circa e riportare lo stato normale quando il timer scade (usando setPressed(false)).

Attento con la scadenza del timer: è necessario che lo setPressed(false) si verifichi sul thread dell'interfaccia utente. Quindi dovrai utilizzare SwingUtilities.invokeLater() come wrapper per la seconda chiamata a setPressed. Oppure, in alternativa, utilizzare uno javax.swing.Timer come mezzo per mettere in coda la seconda chiamata; ci vuole un ritardo e un Action, e il Action viene eseguito sul thread dell'interfaccia utente.

+0

no, non ho alcun problema con, né con JButtons che dipinge – mKorbel

+0

Grazie, avrò un andare e vedere come procedo con questo approccio. –

+0

Funziona perfettamente. –