Заставить JButton вести себя как JMenu

У меня есть следующий код для JMenuBar (Этот код был взят из бесплатного вызова Java-программыJGuiD и отредактировано для личных целей)

import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.Dimension;
import java.awt.Color;

public class GuiDMenuBar extends JMenuBar
{
    JMenu m_file,m_edit,m_help;
    JMenuItem mi_f_new,mi_f_open,mi_f_save,mi_f_saveas,mi_f_exit;
    JMenuItem mi_e_cut,mi_e_copy,mi_e_paste,mi_e_delete;
    JMenuItem mi_v_motif,mi_v_java,mi_v_windows,mi_v_nimbus;
    JMenuItem mi_h_help,mi_h_about;
    JButton m_code;

    public GuiDMenuBar()
    {
        setBorderPainted(true);
        makeFileMenu();
        makeEditMenu();
        makeCodeButton();
        makeHelpMenu();
    }

    void makeFileMenu()
    {
        m_file = new JMenu("File");
        m_file.setMnemonic('F');

        mi_f_new = new JMenuItem("New",new ImageIcon("icons/new_project.png"));
        mi_f_new.setMnemonic('N');
        mi_f_open = new JMenuItem("Open",new ImageIcon("icons/open_project.png"));
        mi_f_open.setMnemonic('O');
        mi_f_save = new JMenuItem("Save",new ImageIcon("icons/save.png"));
        mi_f_save.setMnemonic('S');
        mi_f_saveas = new JMenuItem("Save Java File",new ImageIcon("icons/saveas.png"));
        mi_f_saveas.setMnemonic('J');
        mi_f_exit = new JMenuItem("Exit",new ImageIcon("icons/exit.png"));
        mi_f_exit.setMnemonic('X');

        mi_f_new.setAccelerator(KeyStroke.getKeyStroke("control N"));
        mi_f_open.setAccelerator(KeyStroke.getKeyStroke("control O"));
        mi_f_save.setAccelerator(KeyStroke.getKeyStroke("control S"));
        mi_f_saveas.setAccelerator(KeyStroke.getKeyStroke("control J"));
        mi_f_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));

        m_file.add(mi_f_new);
        m_file.add(mi_f_open);
        m_file.addSeparator();
        m_file.add(mi_f_save);
        m_file.add(mi_f_saveas);
        m_file.addSeparator();
        m_file.add(mi_f_exit);

        add(m_file);
    }

    void makeEditMenu()
    {
        m_edit = new JMenu("Edit");
        m_edit.setMnemonic('E');

        mi_e_cut = new JMenuItem("Cut",new ImageIcon("icons/cut.png"));
        mi_e_cut.setMnemonic('X');
        mi_e_copy = new JMenuItem("Copy",new ImageIcon("icons/copy.png"));
        mi_e_copy.setMnemonic('C');
        mi_e_paste = new JMenuItem("Paste",new ImageIcon("icons/paste.png"));
        mi_e_paste.setMnemonic('P');
        mi_e_delete = new JMenuItem("Delete",new ImageIcon("icons/delete.png"));
        mi_e_delete.setMnemonic('D');


        mi_e_cut.setAccelerator(KeyStroke.getKeyStroke("control X"));
        mi_e_copy.setAccelerator(KeyStroke.getKeyStroke("control C"));
        mi_e_paste.setAccelerator(KeyStroke.getKeyStroke("control V"));
        mi_e_delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));

        m_edit.add(mi_e_cut);
        m_edit.add(mi_e_copy);
        m_edit.add(mi_e_paste);
        m_edit.add(mi_e_delete);

        add(m_edit);
    }

    void makeHelpMenu()
    {
        m_help = new JMenu("Help");
        m_help.setMnemonic('H');

        mi_h_help = new JMenuItem("Help",new ImageIcon("icons/help.png"));
        mi_h_help.setMnemonic('H');
        mi_h_about = new JMenuItem("About");
        mi_h_about.setMnemonic('A');

        mi_h_help.setAccelerator(KeyStroke.getKeyStroke("F1"));
        mi_h_about.setAccelerator(KeyStroke.getKeyStroke("control A"));

        m_help.add(mi_h_help);
        m_help.addSeparator();
        m_help.add(mi_h_about);

        add(m_help);
    }

    void makeCodeButton()
    {
        m_code = new JButton();

        m_code.setOpaque(false);
        m_code.setContentAreaFilled(false);
        m_code.setBorder(null);
        m_code.setFocusable(false);

        m_code.setText("Code   Shift C");

        Dimension dBt = new Dimension(75,25);
        m_code.setMinimumSize(dBt);
        m_code.setPreferredSize(dBt);
        m_code.setMaximumSize(dBt);

        m_code.getModel().addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e) 
            {
                ButtonModel model = (ButtonModel) e.getSource();

                if(model.isRollover())
                {
                    m_code.setBackground(Color.RED);
                    m_code.setOpaque(true);
                } 

                else 
                {
                    m_code.setBackground(null);
                    m_code.setOpaque(false);
                    m_code.setContentAreaFilled(false);
                }
             }
        });

        m_code.setMnemonic('C');

        add(m_code);
    }

    public void addListeners(ActionListener al)
    {
        mi_f_new.addActionListener(al);
        mi_f_open.addActionListener(al);
        mi_f_save.addActionListener(al);
        mi_f_saveas.addActionListener(al);
        mi_f_exit.addActionListener(al);

        mi_e_cut.addActionListener(al);
        mi_e_copy.addActionListener(al);
        mi_e_paste.addActionListener(al);
        mi_e_delete.addActionListener(al);

        mi_h_help.addActionListener(al);
        mi_h_about.addActionListener(al);

        m_code.addActionListener(al);
    }

}

Моя цель - сделать так, чтобы JButton казался JMenu. Это может повлечь за собой то, что кнопка меняет цвет только тогда, когда я взаимодействую с остальной частью JMenuBar, а не только когда я наводю на нее курсор. Например, если я нажал на JMenum_file а затем завис над JButton, фон изменился бы, однако, если бы я ранее не взаимодействовал с JMenuBar, он не должен менять фон, когда я наводил курсор на JButton. Следующее, что требуется, - JMenuBar рассматривает его как JMenu. Я имею в виду это в том смысле, что когдаF10 нажата и выбран первый JMenu. После этого вы можете нажать на стрелку вправо на клавиатуре со стрелкой на клавиатуре, это выберет следующее JMenu Однако использование этого метода навигации пропускает JButton и не позволяет вам взаимодействовать с JButton в любом случае. Я также имею в виду это в том смысле, что если вы взаимодействуете с JMenu, а затем наводите курсор мыши на JButton, JMenuBar показывает, что вы все еще зависаете над JMenu (см. Рисунок).

Итак, я полагаю, у меня есть три вопроса.

Как заставить JButton изменять цвет только в том случае, если JMenuBar уже взаимодействует?

Как вы заставляете JMenuBar рассматривать JButton как JMenu в тех чувствах, которые я описал?

Кто-нибудь знает точный цвет фона JMenu при наведении на него курсора? Поскольку я предпочел бы изменить фон моего JButton на тот же цвет фона JMenu, а не просто красный.

Спасибо,

Дэн

Ответы на вопрос(0)

Ваш ответ на вопрос