2015-06-01 70 views
9

我有一種情況,在點擊一個JButton之後需要顯示一個JOptionPane。 JButton有一個默認圖標和一個滾動圖標(顯示鼠標在按鈕上滾動的時間)。但是,一旦點擊該按鈕並出現JOptionPane,翻轉圖標就不會變回原來的狀態,並繼續保持原樣,直到用戶在選擇合適的JOptionPane選項後將鼠標移回JButton的框架。如何在JButton被點擊並顯示JOptionPane時「展開」展開?當顯示一個JOptionPane時,顯示一個JButton「Un-rollover」

TL; DR:JButton即使單擊並顯示JOptionPanel也會顯示翻轉圖標。我不喜歡。

這裏的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); 
    } 

} 

注:我已經發現了幾類似問題這一個。然而,這個問題不是重複的,因爲這些問題與這個問題稍有不同(例如按鈕保持按下,而不是翻轉)。其中的幾個問題(當然,實際上所有的人我能找到)是:

回答

5

翻轉狀態由ButtonModel管理。您可以通過模型的setRollover(boolean b)方法重置翻轉標誌,該方法會將圖標設置回非翻轉狀態圖標。實現在你的榜樣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); 
    } 
}); 

您可能還希望檢查鼠標仍然位於該JButton後,關閉對話框重置翻轉標誌(如有必要) - 您可以通過MouseInfo這樣做,通過使用SwingUtilities.convertPointFromScreen將從MouseInfo.getPointerInfo().getLocation()檢索到的屏幕座標轉換爲組件座標來檢查JButton是否包含點。

+0

+1:非常感謝!這非常好。我在JButton本身而不是ButtonModel上搜索setRollover()函數。 –

1

如果你能不被情態的對話框住,將

dialog.setModal(false); 

添加到您的動作偵聽器塊。

+0

+1:這是一個非常整齊的解決方法。但當然,我更願意通過強迫*用戶做出絕對控制,然後在那裏做出決定...... Mwahahahahaha ... –