java将KeyListener添加到Jframe问题
我在Netbeans中制作了一个jframe,这个jframe是由另一个java类“启动”的,但对于当前的问题来说,这并不重要。重要的是,我似乎不知道如何将我的关键侦听器添加到我的jframe中。我已经实现了按键侦听器,添加了所需的功能(键入键、按下键和释放键)。但我不知道如何实际添加/启动实际的密钥侦听器,以使其工作
到目前为止,我已经尝试了两种不同的方法,首先我尝试在代码的开头添加行addKeylistener(new JFrameList());
,实际的jframe正在启动,但是这样做实际的帧甚至不会显示出来。除此之外,我还尝试在另一个函数callJframFForm()
中添加同一行,该函数在调用jframe的同时从另一个类调用。但这只是返回错误non-static method addKeyListener(KeyListener) cannot be referenced from a static context
。我不确定还有什么其他方法可以添加关键侦听器,因此我正在寻求一些帮助
目前,我的代码与下面的代码类似
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class JFrameList extends javax.swing.JFrame implements KeyListener{
public static String keyPresCod = "";
public JFrameList() {
initComponents();
addKeyListener(new JFrameList()); //This is where I am currently trying to call from, but frame won't show
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrameList().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
// End of variables declaration
static void callJframFForm(){
try {
//This is where I have also tried to add the initialization line
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void keyTyped(KeyEvent e) {
int codeFKey = e.getKeyCode();
if (codeFKey == KeyEvent.VK_A) {
System.out.println("Button A clicked");
keyPresCod = "A";
} else if (codeFKey == KeyEvent.VK_B) {
System.out.println("Button B clicked");
keyPresCod = "B";
} else {
System.out.println("Different key pressed");
keyPresCod = "Another key";
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
# 1 楼答案
关键事件只发送到具有焦点的组件。你没有发布完整的代码,但我猜重点是你添加到框架中的按钮,所以按钮得到了KeyEvent
不确定你想用KeyListener做什么。通过查看KeyEvent中键入的字符,您无法判断单击了哪个按钮
如果你想知道点击了哪个按钮,那么你需要在每个按钮上添加一个
ActionListener
。阅读Swing教程中关于How to Use Buttons的部分,了解更多信息和示例# 2 楼答案
问题
这将创建一个新的
JFrameList
对象并使用它的侦听器。这意味着任何击键都存储在新对象的成员中。要看到结果,你必须JFrameList=新JFrameList(); addKeyListener(列表); //使用列表变量访问按键代码
当然,这不是你想要的行为。您希望关键点笔划存储在当前实例中,而不是新对象中。这意味着你应该
尽管你可能会注意到听者只是“有时”工作,或者根本不工作,这取决于你测试它的方式
Swing使用焦点系统来管理哪些侦听器应该接收事件,并且由于您正在将侦听器添加到
JFrame
,因此只有当帧处于焦点时,侦听器才会接收事件解决方案
你应该use key bindings rather than a key listener
如果选择继续使用侦听器,则应将其添加到按钮中,而不是框架中:
您可以通过调用
event.getSource()
来获取事件源(您的按钮),而不是检查事件的关键代码键绑定允许您为组件设置灵活的焦点设置。您只需访问组件的输入映射即可:
你的
JFrameList
现在应该实现ActionListener
,而不是KeyListener
,因为它将以动作的形式接收你的事件:另类
JButton
具有内置的助记处理。可以通过JButton#setMnemonic(int)
指定助记符,其中参数是键代码:这是在图形界面中处理热键的标准方法。只需按住Alt键(windows),然后按设置助记符的键