大家好,我用java做了个桌面程序,界面就一个显示窗口和许多按钮(JButton),我实现了按钮与键盘绑定,但是有个小问题要请教!!
运行程序后,必须先用鼠标点击一下按钮(随便哪一个),然后通过键盘输入才有反应。如果一打开程序就直接按键盘,那么没有任何反应! 我试了一下,一打开程序后按 Ctrl+Tab ,这样第一个按钮上的文本就会出现一个小框框,意思是选中了,这样之后,键盘功能才能实现! 我想要一打开程序,键盘输入就有响应,不需要预先点击某个按钮!
运行程序后,必须先用鼠标点击一下按钮(随便哪一个),然后通过键盘输入才有反应。如果一打开程序就直接按键盘,那么没有任何反应! 我试了一下,一打开程序后按 Ctrl+Tab ,这样第一个按钮上的文本就会出现一个小框框,意思是选中了,这样之后,键盘功能才能实现! 我想要一打开程序,键盘输入就有响应,不需要预先点击某个按钮!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;class MyKeyListener implements KeyListener{
public void keyPressed(KeyEvent evt) {
System.out.println("\n按键被按下");
showKeyEventMsg(evt);
}
public void keyReleased(KeyEvent evt){ }
public void keyTyped(KeyEvent evt) { }
private void showKeyEventMsg(KeyEvent evt){//显示按键事件信息
//得到按键对应的整型数
int code = evt.getKeyCode();
//返回按键事件所代表的字符
char c = evt.getKeyChar();
//得到代表按键的字符串
String szText = KeyEvent.getKeyText(code);
if (code != KeyEvent.VK_UNDEFINED)
System.out.println("\n按键对应的整型数:"+code);
if (c != KeyEvent.CHAR_UNDEFINED)
System.out.println("\n与按键相联系的字符:"+c);
if (evt.isShiftDown())
System.out.println("\n按键Shift被按下");
System.out.println("\n按键本身的字符串:"+szText);
}
}
class ButtonPanel extends JPanel{
public ButtonPanel() {
//新建一个文本域组件
tf = new JTextField(20);
add(tf);
//指定用来处理该按钮事件的监听器对象为JPanel本身
myListener = new MyKeyListener();
tf.addKeyListener(myListener);
}
private JTextField tf;
private MyKeyListener myListener;
}
class ButtonFrame extends JFrame{
public ButtonFrame() {
setTitle("键盘事件示例程序");
setSize(300, 200);
setLocation(100,100);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
Container ctPane = getContentPane();
ctPane.add(new ButtonPanel());
}
} public class KeyEvt{
public static void main(String[] args) {
JFrame frame = new ButtonFrame();
frame.setVisible(true);
}
}
// 设置默认按钮
this.getRootPane().setDefaultButton(button);
你的代码就是给一个当行文本框增加一个事件监听器,时间监听器类是自己定义的,实现了键盘监听器接口,从而实现键盘功能。
你可能没看清楚我提的问题,我的程序里的所有JButton都实现了键盘事件监听,都绑定了键盘上的某个键。当按下自定义的键时候,相当于点击了相应的JButton
就是有这样的小问题,每当打开程序后,马上用键盘就没有任何相应,必须用鼠标先点击某个JButton(随便哪个都可以),然后键盘就有响应了,就可以代替相应的JButton了
下面的例子是用来监听键盘X按键的 import java.awt.event.KeyEvent;import com.yovn.labs.KeyBoardMonitor;
import com.yovn.labs.SystemKBListener;public class M {
public static void main(String[] args) {
KeyBoardMonitor monitor = KeyBoardMonitor.getInstance();
System.out.println("1111");
monitor.setSystemKBListener(new SystemKBListener() {
public void keyDown(int arg0) {
if (arg0 == KeyEvent.VK_X)
System.out.println("sucesss"); } public void keyUp(int arg0) {
} });
monitor.enableMonitor();
}
}
import java.awt.event.*;
import javax.swing.*;public class KeyTest extends JFrame{ /**
*
*/
private static final long serialVersionUID = 0L; public KeyTest() {
this.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e) {
if(e.getKeyChar()==KeyEvent.VK_ENTER){
JOptionPane.showMessageDialog(null, "你按了回车键");
}
} public void keyReleased(KeyEvent e) {
} public void keyTyped(KeyEvent e) {
}
});
}
public static void main(String[] args) {
KeyTest frame=new KeyTest();
frame.setTitle("按钮测试");
frame.setSize(400, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
但是还是没反应
谢谢!!
按9楼大哥代码,确实整个Frame都可以收到回车键
我的键盘监听类
private class KeyBoard extends KeyAdapter { public void keyPressed(KeyEvent e) {
char keystr = e.getKeyChar();
if (keystr == '7')
keys[0].doClick();
else if (keystr == '8')
keys[1].doClick();
else if (keystr == '9')
keys[2].doClick();
else if (keystr == '+')
keys[3].doClick();
else if (keystr == '4')
keys[5].doClick();
else if (keystr == '5')
keys[6].doClick();
else if (keystr == '6')
keys[7].doClick();
else if (keystr == '-')
keys[8].doClick();
else if (keystr == '1')
keys[10].doClick();
else if (keystr == '2')
keys[11].doClick();
else if (keystr == '3')
keys[12].doClick();
else if (keystr == '*')
keys[13].doClick();
else if (keystr == '0')
keys[15].doClick();
else if (keystr == '.')
keys[17].doClick();
else if (keystr == '/')
keys[18].doClick();
else if (keystr == '=' || keystr == KeyEvent.VK_ENTER)
keys[19].doClick();
else if (keystr == KeyEvent.VK_BACK_SPACE)
commandkeys[0].doClick();
} }
如果只对frame注册此监听类,按道理也应该要执行相应的动作,但是没有任何反应
希望大家帮我顶!!!!