Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361

    Effetto "hover" JButton/JLabel

    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
    Ultima modifica di Ansharja; 29-01-2016 a 12:10

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    voglio cambiare il colore del testo a seconda che il mouse sia o no al di sopra del componente
    Siccome non c'è un "foreground" (il colore) per stati differenti ma solo uno che è unico, questo devi farlo tu espressamente con del codice, ovvero MouseListener, mouseEntered/mouseExited. Quando si entra setti il foreground A, quando si esce setti il foreground B.

    Nota però che come leggerai sotto, c'è lo stato "rollover", quindi MouseListener non è l'unica soluzione.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    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 le icone Swing supporta già tutti gli stati. Ti basta(va) guardare la documentazione javadoc per trovare:

    setDisabledIcon
    setDisabledSelectedIcon
    setRolloverIcon
    setSelectedIcon
    ecc...

    "rollover" è appunto l'effetto di hover. E va abilitato però con setRolloverEnabled.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Vi vengono idee migliori per gestire l'entrata/uscita del mouse sul singolo componente?
    Il concetto è quello. Non mi piace molto tutto il giro di test instanceof, cast ecc.. che fai. Ma ovviamente non conosco l'architettura che hai realizzato. Molto probabilmente si può fare di meglio.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    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.
    Già il tasto "space" fa premere il pulsante e hai effettivamente la sensazione del "premuto". Prova.
    E il tasto space comunque è solo un key-binding, che tra l'altro si può cambiare.


    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    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?
    No, sia dal punto di vista tecnico (sei in un thread non il Event Dispatch Thread e quindi non dovresti accedere al/i componente/i) e sia concettualmente non è granché utile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Grazie intanto della risposta

    La cosa divertente è che le diverse icone le avevo già usate per i JCheckBox e stupidamente non ci ho pensato anche per i bottoni, anche perché ignoravo che con "rollover" si intendesse l'effetto di hover.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Già il tasto "space" fa premere il pulsante e hai effettivamente la sensazione del "premuto". Prova.
    E il tasto space comunque è solo un key-binding, che tra l'altro si può cambiare.
    Scusami, ma questa parte mi è poco chiara...

    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, sia dal punto di vista tecnico (sei in un thread non il Event Dispatch Thread e quindi non dovresti accedere al/i componente/i) e sia concettualmente non è granché utile.
    Avrebbe senso invece modificare l'icona all'interno dei metodi keyPressed() e keyReleased() ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.