簡體   English   中英

如何將鼠標偵聽器添加到JOptionPane按鈕?

[英]How to add mouse listener to JOptionPane button?

我想更改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 varibles:

    Font f = new Font("System", Font.PLAIN, 12);
    Font b = new Font("System", Font.BOLD, 12);

我可以從頭開始進行新的對話,並阻止這種行為,但這太過分了。

有什么方法可以訪問JOptionPane上的Button並為其添加鼠標偵聽器?

如果您想在所有OptionPanel中看到相同的效果,我認為重寫BasicOptionPaneUI是一個很好的解決方案

這是一個最小的例子

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);
            }

在方法protected Object[] 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");

上面的代碼將更改您創建的所有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() );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM