我有一个我在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) {
}
}
答案 0 :(得分:1)
addKeyListener(new JFrameList())
这将创建一个新的JFrameList
对象并使用它的侦听器。这意味着任何击键都存储在新对象的成员中。要查看结果,您必须执行
JFrameList list = new JFrameList(); addKeyListener(列表); //使用list变量访问keyPressed代码
当然,这不是你想要的行为。您希望键笔划存储在当前实例中,而不是新对象。这意味着你应该做
addKeyListener(this)
虽然你可能会注意到听众只能工作"有时",或者可能根本没有,取决于你如何测试它。
Swing使用焦点系统来管理哪些侦听器应该接收事件,并且由于您要将侦听器添加到JFrame
,因此只有当帧处于焦点时,侦听器才会接收事件。
你应该use key bindings rather than a key listener。
如果您选择继续使用监听器,则应将其添加到按钮,而不是框架:
jButton1.addKeyListener(this);
jButton2.addKeyListener(this);
您可以通过调用event.getSource()
来获取事件的来源(您的按钮),而不是检查事件的关键代码。
键绑定允许您为组件设置灵活的焦点设置。您需要做的就是访问组件的输入映射:
String actionCommand = "Press Button A";
jButton1.setActionCommand(actionCommand);
jButton1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), actionCommand);
jButton1.getActionMap(actionCommand, this);
您的JFrameList
现在应该实现ActionListener
而不是KeyListener
,因为它会将您的活动作为操作接收:
class JFrameList extends JFrame implements ActionListener {
private JButton jButton1;
public JFrameList() {
jButton1 = new JButton("A");
//set action command, add to input map, add to action map
}
public void actionPerformed(ActionEvent event) {
JButton button = (JButton) event.getSource();
System.out.println(button.getActionCommand() + " was performed.");
}
}
JButton
具有内置的助记符处理功能。您可以通过JButton#setMnemonic(int)
指定助记符,其中参数是关键代码:
jButton1.setMnemonic(KeyEvent.VK_A);
这是在图形界面中处理热键的标准方法。只需按住Alt键(窗口),然后按下您设置助记符的键。
答案 1 :(得分:0)
仅将事件调度到具有焦点的组件。您没有发布整个代码,但我猜测焦点在于您添加到框架的按钮,因此按钮获取KeyEvent。
不确定您要使用KeyListener进行的操作。您无法通过查看KeyEvent中键入的字符来判断单击了哪个按钮。
如果您想知道点击了哪个按钮,则需要为每个按钮添加ActionListener
。阅读How to Use Buttons上Swing教程中的部分,了解更多信息和示例。