"Un-rollover" 显示 JOptionPane 时的 JButton

"Un-rollover" a JButton when a JOptionPane is displayed

我有一种情况需要在单击 JButton 后显示 JOptionPane。 JButton 有一个默认图标和一个滚动图标(当鼠标滑过按钮时显示)。但是,单击按钮并出现 JOptionPane 后,鼠标悬停图标不会变回原来的状态,并且会继续保持这种状态,直到用户在选择适当的 JOptionPane 选项后将鼠标移回 JButton 的框架。单击 JButton 并显示 JOptionPane 时,我将如何 "un-rollover" JButton?

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);
  }

}

注意:我发现了几个与此问题相似 的问题。但是,这个问题不是重复的,因为这些问题与这个问题略有不同(例如按钮保持按下状态,而不是滚动)。其中一些问题(嗯,实际上我能找到的所有问题)是:

如果您可以接受非模态对话框,请添加

dialog.setModal(false);

到您的动作侦听器块。

翻转状态由 ButtonModel 管理。您可以通过模型的 setRollover(boolean b) 方法重置翻滚标志,这会将 Icon 设置回非翻滚状态 Icon。在您的示例中实现 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, checking if the JButton contains the point by converting the Screen coordinates retrieved from MouseInfo.getPointerInfo().getLocation() to component coordinates using SwingUtilities.convertPointFromScreen 执行此操作。