"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);
}
}
注意:我发现了几个与此问题相似 的问题。但是,这个问题不是重复的,因为这些问题与这个问题略有不同(例如按钮保持按下状态,而不是滚动)。其中一些问题(嗯,实际上我能找到的所有问题)是:
- JButton stays pressed when focus stolen by JOptionPane
- JButton stays pressed after a JOptionPane is displayed
- JButton “stay pressed” after click in Java Applet
如果您可以接受非模态对话框,请添加
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 执行此操作。
我有一种情况需要在单击 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);
}
}
注意:我发现了几个与此问题相似 的问题。但是,这个问题不是重复的,因为这些问题与这个问题略有不同(例如按钮保持按下状态,而不是滚动)。其中一些问题(嗯,实际上我能找到的所有问题)是:
- JButton stays pressed when focus stolen by JOptionPane
- JButton stays pressed after a JOptionPane is displayed
- JButton “stay pressed” after click in Java Applet
如果您可以接受非模态对话框,请添加
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 执行此操作。