将keylistener添加到JMenuBar

时间:2015-06-03 17:24:51

标签: java swing keylistener 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);
    }
}

1 个答案:

答案 0 :(得分:2)

我仍然认为这是一个坏主意。作为一个用户,我会发现在一个菜单上使用Enter键调用一个Action,而在其他菜单上没有做任何事情,我觉得很困惑。我在评论中提出的建议是一个更好的解决方案。

然而,我很好奇为什么它没有工作,我发现当显示菜单时焦点实际上是在JRootPane上(并且事件仅被调度到具有焦点的组件)。因此,您可以将KeyListener添加到根窗格。

然而,有一种更简单的方法。您可以使用JMenu.addMenuKeyListener(...)方法。该接口与KeyListener相同,除了所有方法包括" menu"在名称中。