2015-06-01 21 views
9

Ho una situazione in cui ho bisogno di visualizzare un JOptionPane dopo aver fatto clic su un JButton. JButton ha un'icona predefinita e un'icona di rollover (che visualizza quando, beh, il mouse scorre sopra il pulsante). Tuttavia, dopo aver fatto clic sul pulsante e visualizzato un JOptionPane, l'icona di rollover non cambia di nuovo all'originale e continua a rimanere tale fino a quando l'utente non riporta il mouse sul frame di JButton dopo aver selezionato un'opzione JOptionPane appropriata. Come faccio a "annullare il rollover" del JButton quando si fa clic e viene visualizzato JOptionPane?"Un-rollover" un JButton quando viene visualizzato un JOptionPane

TL; DR: JButton visualizza l'icona di rollover anche quando viene fatto clic e viene visualizzato JOptionPanel. Non mi piace.

Ecco il SSCCE:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 


public class ButtonUnrollover { 

    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    final JPanel p = new JPanel(); 
    JButton b = new JButton(); 
    b.setIcon(UIManager.getIcon("OptionPane.informationIcon")); 
    b.setRolloverIcon(UIManager.getIcon("OptionPane.errorIcon")); 
// b.setSelectedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
// b.setRolloverSelectedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
// b.setPressedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
    p.add(b); 
    b.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     JOptionPane jOP = new JOptionPane("Dummy message"); 
     JDialog dialog = jOP.createDialog(p, null); 
     dialog.setVisible(true); 
     } 
    }); 

    f.add(p); 
    f.pack(); 
    f.setVisible(true); 
    } 

} 

NB: ho trovato molte simili domande a questo. Tuttavia, questa domanda non è un duplicato perché quelle domande riguardano un problema leggermente diverso da questo (come il pulsante premuto, non arrotolato). Alcune di queste domande (beh, in realtà tutti loro ho potuto trovare) sono:

risposta

5

Lo stato di rollover è gestito da ButtonModel. È possibile ripristinare il contrassegno di rollover tramite il metodo setRollover(boolean b) del modello, che imposterà l'icona all'icona di stato del non rollover. Implementato nel tuo esempio ActionListener:

b.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    b.getModel().setRollover(false);//reset the rollover flag 
    JOptionPane jOP = new JOptionPane("Dummy message"); 
    JDialog dialog = jOP.createDialog(p, null); 
    dialog.setVisible(true); 
    } 
}); 

Si potrebbe anche voler verificare se il mouse si trova ancora sopra la JButton dopo la finestra di dialogo viene chiusa per reimpostare il flag rollover (se necessario) - è possibile farlo tramite MouseInfo, verificare se JButton contiene il punto convertendo le coordinate dello schermo recuperate da MouseInfo.getPointerInfo().getLocation() in coordinate del componente utilizzando SwingUtilities.convertPointFromScreen.

+0

+1: Grazie mille! Questo lo fa molto bene. Stavo cercando la funzione setRollover() sul JButton stesso anziché su ButtonModel. –

1

Se potete vivere con la vostra finestra di dialogo non essendo modale , aggiungi

dialog.setModal(false); 

al blocco di listener di azioni.

+0

+1: Questa è una soluzione molto carina. Ma naturalmente, preferisco avere il controllo assoluto * costringendo * un utente a prendere una decisione allora e lì ... Mwahahahahaha ... –

Problemi correlati