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.
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.
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.
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.
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.