Ciao a tutti,
Nella mia applicazione swing uso due tipi di pulsante per i quali vorrei implementare l'effetto hover,cioè modificare l'aspetto del pulsante quando il mouse entra/esce dal componente.
In particolare per i pulsanti testuali (che hanno questo aspetto: TestoPulsante ) voglio cambiare il colore del testo a seconda che il mouse sia o no al di sopra del componente, per i pulsanti con un'icona voglio invece scambiare tra di loro un'icona che indica lo stato attivo e un'altra che indica lo stato disattivo.
Per tutti e due i pulsanti poi imposto il cursore a manina quando entro sul componente.
Nel MouseListener che aggiungo ai pulsanti faccio quindi qualcosa del genere:
codice:
......
public void mouseEntered(MouseEvent e)
{
Component c=e.getComponent();
c.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
// ovviamente ogni oggetto MyJButton ha due icone che scambio in base al parametro
// che passo al metodo changeIcon
if(c instanceof MyJButton)(MyJButton(c)).changeIcon(true);
else ((JLabel)c).setForeground(Color.RED);
}
public void mouseExited(MouseEvent e)
{
Component c=e.getComponent();
c.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
if(c instanceof MyJButton)(MyJButton(c)).changeIcon(false);
else ((JLabel)c).setForeground(Color.GREEN);
}
......
Vi vengono idee migliori per gestire l'entrata/uscita del mouse sul singolo componente?
Assumendo che questa strada sia accettabile ho un altra perplessità: alcuni bottoni possono essere richiamati anche con la pressione di un tasto sulla tastiera (ho registrato un KeyListener su questo genere di pulsanti), e voglio dare all'utilizzatore la sensazione di aver comunque premuto tale bottone, settandoci per un certo periodo l'icona sullo stato attivo e poi rimettendola allo stato disattivo.
Pensavo quindi di richiamare un metodo all'interno della classe MyJButton che faccia partire un thread per lo scambio delle icone, qualcosa del genere:
codice:
public void changeIcons()
{
new Thread(new Runnable()
{
public void run()
{
try{
changeIcon(true);
Thread.sleep(250);
changeIcon(false);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
Può andare bene come soluzione?
Grazie a tutti per l'attenzione