"取消侧翻"显示JOptionPane时的JButton

时间:2015-06-01 19:36:41

标签: java swing jbutton joptionpane

我遇到需要在点击JButton后显示JOptionPane的情况。 JButton有一个默认图标和一个翻转图标(显示鼠标滚过按钮的时间)。但是,一旦单击按钮并出现JOptionPane,翻转图标就不会变回原始图标,并继续保持这种状态,直到用户在选择适当的JOptionPane选项后将鼠标带回JButton框架。我将如何"展开"单击JButton并显示JOptionPane?

TL; DR :即使单击并显示JOptionPanel,JButton也会显示翻转图标。我不喜欢。

这里是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);
  }

}

注意:我在这个问题上找到了几个类似的问题。但是,这个问题并不重复,因为这些问题属于与此问题略有不同的问题(例如按钮保持按下,而不是翻转)。其中一些问题(实际上我能找到的所有问题)都是:

2 个答案:

答案 0 :(得分:5)

翻转状态由ButtonModel管理。您可以通过模型的function Record-Bindings([string]$siteName) { Import-module WebAdministration (Get-Item IIS:\Sites\$siteName).Bindings.Collection | Select-Object bindinginformation, Protocol, @{ name="IP"; expression={$_.bindinginformation.split(":")[0]}}, @{name="Port"; expression={$_.bindinginformation.split(":")[1]}}, @{name="HostName"; expression={$_.bindinginformation.split(":")[2]}}, @{name="certificateHash"; expression={$_.GetAttributeValue("certificateHash")}}, @{name="sslFlags"; expression={$_.GetAttributeValue("sslFlags")}} | Where-Object {$_.Port -lt 8000} | ForEach-Object { "New-WebBinding -name '{0}' -Protocol {1} -IPAddress '{2}' -Port {3} -HostHeader '{4}' -Thumbprint '{5}' -SslFlags {6}" ` -f "$siteName",$_.protocol,$_.IP, $_.Port, $_.HostName, $_.certificateHash, $_.sslFlags } > c:\temp\bindings-$siteName.ps1 } 方法重置翻转标志,该方法会将图标设置回非翻转状态图标。在您的示例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); } }); 以重置翻转标记(如有必要) - 您可以通过MouseInfo执行此操作,检查是否JButton通过使用SwingUtilities.convertPointFromScreen将从JButton检索到的屏幕坐标转换为组件坐标来包含该点。

答案 1 :(得分:1)

如果您的对话框不是模态的,请添加

dialog.setModal(false);

到你的动作监听器块。