我遇到需要在点击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);
}
}
注意:我在这个问题上找到了几个类似的问题。但是,这个问题并不重复,因为这些问题属于与此问题略有不同的问题(例如按钮保持按下,而不是翻转)。其中一些问题(实际上我能找到的所有问题)都是:
答案 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);
到你的动作监听器块。