让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的其余部分进行交互时才会改变颜色,而不仅仅是当我将鼠标hover在它上面时。 例如,如果我点击JMenu m_file然后在JButton上空盘旋,背景就会改变,但是如果我之前没有与JMenuBar交互,那么当我将鼠标hover在JButton上时它不应该改变背景。 接下来需要的是JMenuBar将其视为JMenu。 我的意思是,当点击F10并选择第一个JMenu时。 之后,您可以单击键盘上箭头键盘上的右箭头,这将选择下一个JMenu。 但是,使用这种导航方法会跳过JButton,并且不允许您以任何方式与JButton进行交互。 我的意思是,如果你与JMenu交互然后将鼠标hover在JButton上,JMenuBar就会显示你仍然在JMenu上空盘旋(见图片)。

两个互动一下子

所以我想我有三个问题。

  1. 如果JMenuBar已经与之交互,你如何让JButton只改变颜色?

  2. 你如何让JMenuBar在我描述的意义上将JButton视为JMenu?

  3. 当你将鼠标hover在它上面时,是否有人知道JMenu背景的确切颜色? 因为我更喜欢将我的JButton的背景改为JMenu背景的相同颜色,而不是仅仅是红色。

谢谢,