我有两个框架(一个主框架和一个弹出框架)。在主框架键和&添加了鼠标监听器。两者都工作得很好。弹出窗口有50个按钮。我有一个动作监听器。它工作正常。我也有钥匙和钥匙老鼠听众。鼠标工作。关键是片状。 主框架中使用的相同keyListener类也会添加到弹出框架中。 一旦弹出显示,关键监听器工作,一旦鼠标点击发生(动作监听器启动)keylistener停止工作。请帮忙。附带的代码是简化版
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class key {
private static class toolsAction implements ActionListener {
public void actionPerformed (ActionEvent ae) {
log("Command " + Integer.parseInt(ae.getActionCommand()));
}
}
private static void log(String s) { System.out.println(s); }
private static class keyboardHandler implements KeyListener {
public void keyPressed( KeyEvent e) { log("KB Press called "); }
public void keyReleased(KeyEvent e) { log("KB Release called "); }
public void keyTyped (KeyEvent e) { log("KB Typed called "); }
}
public static void main(String [] args) {
JFrame pFrame = new JFrame("Frame");
pFrame.addKeyListener(new keyboardHandler());
Container pane = pFrame.getContentPane();
pane.setLayout(null);
pane.setVisible(true);
pFrame.setSize(650, 300);
pFrame.setVisible(true);
JButton[] buttons = new JButton[50];
toolsAction action = new toolsAction();
for (int i = 0; i < 50; i++) {
buttons[i] = new JButton("" + i);
buttons[i].setActionCommand("" + i);
buttons[i].addActionListener(action);
pane.add(buttons[i]);
buttons[i].setBounds(((i % 10) * 60), ((i / 10) * 40), 60, 40);
}
}
}
答案 0 :(得分:4)
替代方法使用Action
和key bindings。下面的示例将10个按钮绑定到数字键,同时使用数字作为每个按钮的MNEMONIC_KEY
。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/** @see http://stackoverflow.com/a/14182227/230513 */
public class Key {
public static final int SIZE = 10;
private static class ToolAction extends AbstractAction {
public ToolAction(int i) {
super(String.valueOf(i));
putValue(MNEMONIC_KEY, KeyEvent.VK_0 + i);
}
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println(ae.getActionCommand());
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, SIZE / 2));
for (int i = 0; i < SIZE; i++) {
final ToolAction toolAction = new ToolAction(i);
JButton b = new JButton(toolAction);
String name = b.getText();
b.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_0 + i, 0), name);
b.getActionMap().put(name, toolAction);
f.add(b);
}
f.pack();
f.setVisible(true);
}
});
}
}
答案 1 :(得分:2)
仅当添加了侦听器的组件具有(键盘)焦点时,才会执行KeyListener
。如果单击另一个组件,该组件将成为焦点,键盘事件将发送到其KeyListener
。
如果没有看到弹出窗口的代码,不确定是不是问题,但这是发布代码中的问题......
修改强>
您可以向AWTEventListener
添加Toolkit
,以便独立于焦点组件拦截所有事件:
private static class AWTListener implements AWTEventListener {
@Override
public void eventDispatched(AWTEvent event) {
log("AWT: " + event);
}
};
...
Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addAWTEventListener(new AWTListener(), AWTEvent.KEY_EVENT_MASK);
答案 2 :(得分:1)
我通过添加MouseMotionListener并在调用pFrame.requestFocusInWindow()&amp;的mouseMoved方法中解决了这个问题。 还在按钮的actionPerformed方法中添加焦点请求。 只要ActionListener添加到按钮中,即使框架中只有一个按钮,KeyListener也不起作用。 这充其量只是克鲁迪,但对我有用。我仍然希望听到社区为什么我的原始代码不起作用。