java - 如何将鼠标侦听器添加到 JOptionPane 按钮?
问题描述
我想更改 JOptionPane.ShowMessageDialog 上 Button 的外观。我设法改变了按钮标题
UIManager.put("OptionPane.okButtonText", "Text I want");
现在,我的下一个目标是让 Button 与我的应用程序中的其他按钮一样工作。也就是说,当鼠标悬停在它上面时,它会改变背景和字体颜色。在我的其余按钮上,我添加了像这样的鼠标侦听器:
//setting change color on hover
private final MouseListener mouseAction = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(163, 184, 204));
rollOver.setForeground(Color.WHITE);
rollOver.setFont(b);
}
};
@Override
public void mouseExited(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(230, 230, 230));
rollOver.setForeground(Color.BLACK);
rollOver.setFont(f);
}
};
};
以前在代码中我设置了字体变量:
Font f = new Font("System", Font.PLAIN, 12);
Font b = new Font("System", Font.BOLD, 12);
我可以从头开始制作新的对话框并实现这种行为,但这将是矫枉过正。
有什么方法可以访问 JOptionPane 上的 Button 并向其添加鼠标侦听器吗?
解决方案
UIManager.put("OptionPane.okButtonText", "Text I want");
以上将更改您创建的所有 JOptionPanes 上所有“确定”按钮的文本。
如果要更改特定 JOptionPane 上单个按钮上的文本,请阅读 Swing 教程中有关自定义按钮文本的部分。
有什么方法可以访问 JOptionPane 上的 Button 并向其添加鼠标侦听器吗?
当您使用静态showXXX(...)
方法时,会创建一个模态 JDialog,因此您在关闭对话框之前无法访问对话框或其组件,这为时已晚。
因此,您需要手动创建JOptionPane
并将其添加到JDialog
. JOptionPane API
阅读并查看标题为 的部分可以找到执行此操作的基础知识"Direct Use"
。
一旦您创建了JOptionPane
(并且在您使对话框可见之前),您就可以在选项窗格中搜索按钮并MouseListener
为每个按钮添加一个。为了帮助您解决这个问题,您可以使用Swing Utils类。它将对选项窗格进行递归搜索,并将按钮返回给您List
。然后,您可以遍历List
并添加MouseListener
.
使用这个帮助类的基本代码是:
JOptionPane optionPane = new JOptionPane(
"Are you sure you want to exit the application",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_CANCEL_OPTION);
List<JButton> buttons = SwingUtils.getDescendantsOfType(JButton.class, optionPane, true);
for (JButton button: buttons)
{
System.out.println( button.getText() );
}
推荐阅读
- python - 获取拉丁字符的所有 unicode 变体
- android - Android通知重建而不是更新?
- python - 在 Microsoft Edge 中使用 python selenium
- python - 有条件地子集数据框
- excel - 使用 VBA 宏将数据从一个 Excel 工作簿提取到另一个工作簿 - 错误 #9
- c++ - SFINAE 有别名,重载问题
- python - 如何打印可以被 3 和 5 整除的 0 到 100 的数字?
- c# - 在 UWP PasswordBox 中过滤字符的正确方法是什么?
- javascript - 父状态更新后如何仅在子组件中调用一次方法
- c# - 用于搜索和替换流的 Knuth Morris Pratt 搜索算法