Java 如何将鼠标侦听器添加到JOptionPane按钮?

Java 如何将鼠标侦听器添加到JOptionPane按钮?,java,swing,Java,Swing,我想更改JOptionPane.ShowMessageDialog上按钮的外观。 我已设法更改按钮标题与 UIManager.put("OptionPane.okButtonText", "Text I want"); 现在,我的下一个目标是使按钮的工作方式与我的应用程序中的其他按钮相同。也就是说,当鼠标悬停在它上面时,它会更改背景和字体颜色。 在我的其余按钮上,我添加了如下鼠标侦听器: //setting change color on hover private f

我想更改JOptionPane.ShowMessageDialog上按钮的外观。 我已设法更改按钮标题与

UIManager.put("OptionPane.okButtonText", "Text I want");
现在,我的下一个目标是使按钮的工作方式与我的应用程序中的其他按钮相同。也就是说,当鼠标悬停在它上面时,它会更改背景和字体颜色。 在我的其余按钮上,我添加了如下鼠标侦听器:

    //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上的按钮并添加鼠标侦听器
如果您想在所有选项面板中看到相同的效果,我认为override BasicOptions Paneui是一个很好的解决方案

这是一个最小的例子

public class MyOptionPaneUI extends BasicOptionPaneUI {

    @SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"})
    public static ComponentUI createUI(JComponent c) {
        return new MyOptionPaneUI();
    }

    private static final MyMouseListener m = new MyMouseListener();

    @Override
    public void update(Graphics g, JComponent c) {
        super.update(g, c);
    }

    @Override
    protected void installListeners() {
       JButton button = (JButton) getButtons()[0];
        button.addMouseListener(m);

        super.installListeners();
    }

    @Override
    protected void uninstallListeners() {
        JButton button = (JButton) getButtons()[0];
        button.removeMouseListener(m);

        super.uninstallListeners();
    }

    public static class MyMouseListener extends 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);
            }
        };

        @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);
            }
        };
    }
}
在主类的框架内,您可以添加此代码,以便在UIDefoult中加载类

static{
   UIManager.put("OptionPaneUI", MyOptionPaneUI.getClass().getCanonicalName());
}

因为
getButtons()[0]
,因为我在
BasicOptionPaneUI

else if (type == JOptionPane.OK_CANCEL_OPTION) {
                    defaultOptions = new ButtonFactory[2];
                    defaultOptions[0] = new ButtonFactory(
                        UIManager.getString("OptionPane.okButtonText",l),
                        getMnemonic("OptionPane.okButtonMnemonic", l),
                        (Icon)DefaultLookup.get(optionPane, this,
                                          "OptionPane.okIcon"), minimumWidth);
                    defaultOptions[1] = new ButtonFactory(
                        UIManager.getString("OptionPane.cancelButtonText",l),
                        getMnemonic("OptionPane.cancelButtonMnemonic", l),
                        (Icon)DefaultLookup.get(optionPane, this,
                                          "OptionPane.cancelIcon"), minimumWidth);
                } else {
                    defaultOptions = new ButtonFactory[1];
                    defaultOptions[0] = new ButtonFactory(
                        UIManager.getString("OptionPane.okButtonText",l),
                        getMnemonic("OptionPane.okButtonMnemonic", l),
                        (Icon)DefaultLookup.get(optionPane, this,


                "OptionPane.okIcon"), minimumWidth);
            }
在方法内部
受保护对象[]getButtons()


如果你想要鼠标悬停在我正在操作的按钮上的效果,你可以找到鼠标悬停的解决方案

如果您可以使用此常量对库中的DefaoultButton进行个性化设置

UIManager.put("Button[Default].background", new Color(163, 184, 204));
UIManager.put("Button[Default].foreground", Color.WHITE);
UIManager.put("Button[Default].mouseHoverColor", new Color(230, 230, 230));
ps:这只是当您需要在项目中添加鼠标悬停时的信息

UIManager.put("OptionPane.okButtonText", "Text I want");
以上内容将更改您创建的所有JoptionPane上所有“确定”按钮的文本

如果要更改特定JOptionPane上单个按钮上的文本,则 阅读上的Swing教程中的部分

有没有办法访问JOptionPane上的按钮并将鼠标侦听器添加到其中

当您使用静态
showXXX(…)
方法时,会创建一个模态JDialog,因此在关闭对话框之前,您无法访问该对话框或其组件,这太晚了

因此,您需要手动创建
JOptionPane
并将其添加到
JDialog
。阅读
JOptionPane API
并查看标题为
的部分“直接使用”
,可以找到执行此操作的基础知识

创建了
JOptionPane
(在显示对话框之前)后,可以在选项窗格中搜索按钮,并向每个按钮添加一个
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() );
}
JOptionPane optionPane=新建JOptionPane(
“是否确实要退出应用程序”,
JOptionPane.QUESTION\u消息,
JOptionPane.YES\u NO\u CANCEL\u选项);
列表按钮=SwingUtils.getDegenantSoftype(JButton.class,optionPane,true);
用于(JButton按钮:按钮)
{
System.out.println(button.getText());
}

而不是
JOptionPane.show…
您可以创建JOptionPane并对其进行自定义、添加组件等。通过递归遍历它的子级,您可以获取右按钮组件。感谢您的建议,这满足了我的需要。OK按钮文本可以在应用程序范围内替换,我只是在我的语言中设置了“OK”等效词。我需要的是SwingUtils类和添加MouseListener的部分。再次感谢。