Доступ к кнопке JOption Pane для добавления MouseListener к ним - PullRequest
0 голосов
/ 17 апреля 2011

Правильно, я подумал, что это будет относительно просто, если использовать .getComponents() для Компонента, который вернет JPanel из JOptionPane, и они получат JButton s, снова используя этот метод с JPanelОднако я сталкиваюсь с трудностями.

Я хочу использовать слушатель мыши на кнопках JOptionPane, чтобы я мог изменить цвет кнопки при наведении курсора.Есть ли более простой способ добиться этого?

Пока это мой класс ..

package rsapp.gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;


public class RSJPaneComponent extends JOptionPane {

    /**
     * 
     */
    private static final long serialVersionUID = 13453253L;
    private JOptionPane j=this;
    final Color WHITE = Color.WHITE;


    public RSJPaneComponent(){
        UIManager.put("OptionPane.background",WHITE);
        UIManager.put("Panel.background",WHITE);
        UIManager.put("Button.background",WHITE);
        UIManager.put("Button.foreground",new Color(85,153,187));
        UIManager.put("activeCaption", WHITE);
    }

    protected String initJPaneInput(final JFrame f, final String message){
        return j.showInputDialog(f,message);
    }

    public int generateDialog(int error_code, String title_message, String message, final JFrame f){
        return  JOptionPane.showConfirmDialog(
                f,
                message,
                "Error "+error_code+": "+title_message,
                JOptionPane.YES_NO_OPTION);
    }
}

1 Ответ

5 голосов
/ 17 апреля 2011

Есть ли более простой способ добиться этого?

Используйте JDialog. Многолетний опыт подсказывает мне, что, хотя JOptionPane является мощным и удобным компонентом, когда дело доходит до его настройки, вам лучше просто использовать JDialog.


код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

class CustomDialog {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Show Custom Dialog");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400,400);
                frame.setLocationRelativeTo(null);

                final JDialog dialog = new JDialog(frame, "Dialog", true);

                JPanel mainGui = new JPanel(new BorderLayout());
                mainGui.setBorder(new EmptyBorder(20,20,20,20));
                mainGui.add( new JLabel("Contents go here"), BorderLayout.CENTER );

                JPanel buttonPanel = new JPanel(new FlowLayout());
                mainGui.add(buttonPanel, BorderLayout.SOUTH);

                JButton close = new JButton("Close");
                close.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        dialog.setVisible(false);
                    }
                } );

                buttonPanel.add(close);

                frame.setVisible(true);

                dialog.setContentPane(mainGui);
                dialog.pack();
                dialog.setLocationRelativeTo(frame);
                dialog.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Снимок экрана

enter image description here


Обратите внимание, что в этом примере еще не все функции встроены в JOptionPane.

Например, если открыто JOptionPane и пользователь нажимает клавишу выхода, диалоговое окно будет закрыто. Вы можете добавить эту функцию, используя KeyListener или ActionMap.

...