向JMenuBar添加键监听器



我有下面的JMenuBar代码。如何将键侦听器CustomKeyListener添加到整个JMenuBar?

package UI;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.*;
import java.awt.Point;
import java.awt.font.*;
import UI.*;
public class GuiDMenuBar extends JMenuBar
{
    JMenu m_file,m_code;
    JMenuItem mi_f_new,mi_f_open;
    public GuiDMenuBar()
    {
        setBorderPainted(true);
        makeFileMenu();
        makeCodeButton();
    }
    void makeFileMenu()
    {
        m_file = new JMenu("File");
        m_file.setMnemonic('F');
        mi_f_new = new JMenuItem("New");
        mi_f_new.setMnemonic('N');
        mi_f_open = new JMenuItem("Open");
        mi_f_open.setMnemonic('O');
        mi_f_new.setAccelerator(KeyStroke.getKeyStroke("control N"));
        mi_f_open.setAccelerator(KeyStroke.getKeyStroke("control O"));
        m_file.add(mi_f_new);
        m_file.add(mi_f_open);
        add(m_file);
    }
    void makeCodeButton()
    {
        m_code = new JMenu("Code");
        m_code.setMnemonic('C');
        add(m_code);
    }
    public void addListeners(ActionListener al)
    {
        mi_f_new.addActionListener(al);
        mi_f_open.addActionListener(al);
    }
    class CustomKeyListener implements KeyListener
    {
        @Override
        public void keyTyped(KeyEvent e)
        {
            System.out.println("Type");
        }
        @Override
        public void keyPressed(KeyEvent e)
        {
            System.out.println("Press");
        }
        @Override
        public void keyReleased(KeyEvent e)
        {
            System.out.println("Release");
        }
    }
}

我试过添加

    m_code.setFocusable(true);
    m_code.addKeyListener(new CustomKeyListener());

void makeCodeButton,但是当为那个JMenu输入任何东西时没有拾取。这就是为什么我想把它添加到整个JMenuBar

编辑显示完整CustomKeyListener

class CustomKeyListener implements KeyListener
{
    Robot Roby = null;
    @Override
    public void keyTyped(KeyEvent e)
    {
        char c = e.getKeyChar();
        if(c==KeyEvent.VK_ENTER)
        {
            if(m_code.isSelected())
            {
                try
                {
                    Roby = new Robot();
                }
                catch(AWTException awte)
                {
                    awte.printStackTrace();
                }
                clcikComponent(m_file);
            }
        }
        System.out.println("Type");
    }
    @Override
    public void keyPressed(KeyEvent e)
    {
        System.out.println("Press");
    }
    @Override
    public void keyReleased(KeyEvent e)
    {
        System.out.println("Release");
    }
    public void clcikComponent(Component comp)
    {
        Point p = comp.getLocationOnScreen();
        System.out.println(p);
        Roby.mouseMove(p.x,p.y);
        Roby.mousePress(MouseEvent.BUTTON1_MASK);
        Roby.mouseRelease(MouseEvent.BUTTON1_MASK);
    }
}

我仍然认为这是个坏主意。作为一名用户,我发现在一个菜单上使用Enter键调用Action,而在其他菜单上不做任何事情,这让我感到非常困惑。我在评论中给出的建议是一个更好的解决方案。

然而,我很好奇为什么它不起作用,我发现当菜单显示时,焦点实际上是在JRootPane上(事件只被分派到具有焦点的组件)。因此,您可以将KeyListener添加到根窗格。

然而,有一个更简单的方法。您可以使用JMenu.addMenuKeyListener(...)方法。该接口与KeyListener相同,只是所有方法的名称中都包含"menu"。

相关内容

  • 没有找到相关文章