我有下面的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"。