Java 使JButton像JMenu一样工作

Java 使JButton像JMenu一样工作,java,swing,jbutton,jmenu,jmenubar,Java,Swing,Jbutton,Jmenu,Jmenubar,我有以下JMenuBar代码(此代码取自一个免费java程序调用,并出于个人目的进行了编辑) 我的目标是使JButton看起来像一个JMenu。这意味着按钮只在我与JMenuBar的其余部分交互时才改变颜色,而不仅仅是在我将鼠标悬停在它上面时。例如,如果我单击JMenum_文件,然后将鼠标悬停在JButton上,背景会发生变化,但是如果我以前没有与JMenuBar交互,则当我将鼠标悬停在JButton上时,背景不会发生变化。接下来需要的是JMenuBar将其视为JMenu。我的意思是当点击F10

我有以下JMenuBar代码(此代码取自一个免费java程序调用,并出于个人目的进行了编辑)

我的目标是使JButton看起来像一个JMenu。这意味着按钮只在我与JMenuBar的其余部分交互时才改变颜色,而不仅仅是在我将鼠标悬停在它上面时。例如,如果我单击JMenu
m_文件
,然后将鼠标悬停在JButton上,背景会发生变化,但是如果我以前没有与JMenuBar交互,则当我将鼠标悬停在JButton上时,背景不会发生变化。接下来需要的是JMenuBar将其视为JMenu。我的意思是当点击
F10
并选择第一个JMenu时。之后,您可以单击键盘上箭头键键盘上的右箭头,这将选择下一个JMenu。但是,使用这种导航方法会跳过JButton,并且无论如何都不允许您与JButton交互。我的意思是,如果您与JMenu交互,然后将鼠标悬停在JButton上,JMenuBar也会显示您仍然在JMenu上悬停(见图)

所以我想我有三个问题

  • 如果JMenuBar已经与JMenuBar交互,那么如何使JButton仅更改颜色

  • 在我描述的意义上,如何让JMenuBar将JButton视为JMenu

  • 当您将鼠标悬停在JMenu上时,是否有人知道JMenu背景的确切颜色?因为我更喜欢将我的JButton背景更改为与JMenu背景相同的颜色,而不仅仅是红色

  • 谢谢


    Dan

    至于你的第三个问题,背景颜色是组件(getBackground)的一个属性,你可以读取(从一个组件)并设置(在你想要匹配的组件上)。@swingMan非常感谢。1减2至go@swingMan刚刚尝试了这个,不幸的是,它只得到了白色的背景,而不是与jmen交互时显示在jmen上的背景,但无论如何,谢谢为什么?为什么不简单地在菜单栏中添加一个
    JMenu
    ,它的行为就像一个
    JMenu
    ,没有任何额外的工作?@Holger因为,如果我弄错了,请纠正我,我不知道如何将没有任何JMenuItems的JMenu用作按钮类型对象。我不认为你可以添加一个动作监听器,所以当它被点击时,它会做一些事情
    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);
        }
    
    }