【问题标题】:"Un-rollover" a JButton when a JOptionPane is displayed显示 JOptionPane 时“取消翻转”JButton
【发布时间】:2015-06-01 19:36:41
【问题描述】:

我有一种情况,我需要在单击 JButton 后显示 JOptionPane。 JButton 有一个默认图标和一个鼠标悬停图标(当鼠标悬停在按钮上时显示)。但是,一旦单击按钮并出现 JOptionPane,则翻转图标不会变回原始图标,并且会继续保持不变,直到用户在选择适当的 JOptionPane 选项后将鼠标移回 JButton 的框架。当单击 JButton 并显示 JOptionPane 时,我将如何“取消翻转”它?

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

}

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

【问题讨论】:

    标签: java swing jbutton joptionpane


    【解决方案1】:

    翻转状态由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 执行此操作,检查 JButton 是否包含通过使用SwingUtilities.convertPointFromScreen 将从MouseInfo.getPointerInfo().getLocation() 检索到的屏幕坐标转换为组件坐标来指向。

    【讨论】:

    • +1:非常感谢!这做得非常好。我在 JButton 本身而不是 ButtonModel 上搜索 setRollover() 函数。
    【解决方案2】:

    如果你可以忍受你的对话框不是模态的,添加

    dialog.setModal(false);
    

    到你的动作监听器块。

    【讨论】:

    • +1:这是一个非常简洁的解决方法。但是,当然,我更喜欢通过强制用户做出决定来获得绝对控制...... Mwahahahahaha......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多