谁能告诉我 win10 +java1.8+use键盘 swing的键盘监听事件无效
下面是我的代码
@SuppressWarnings("static-access")
public static void main(String[] args) {
JFrame jFrame = new JFrame("计算机");
Container c = jFrame.getContentPane();
JPanel jp2 = new JPanel();
JTextArea jtf = new JTextArea(10, 40);
jtf.setFocusable(false);//禁止文本框被选中
JScrollPane jScrollPane = new JScrollPane(jtf);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jp2.add(jScrollPane);
JPanel jPanel = new JPanel();
c.setLayout(new GridLayout(4, 1));
jPanel.setLayout(new GridLayout(4, 3));
for (int i = 0; i < 10; i++) {
JButton jb = new JButton(9 - i + "");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.append(jb.getText());
}
});
jPanel.add(jb);
}
JButton jb3 = new JButton("←/退格");
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String newStr = jtf.getText().substring(0, jtf.getText().length() - 1);
jtf.setText(newStr);
}
});
jPanel.add(jb3);
JPanel jPanel1 = new JPanel();
jPanel1.setLayout(new GridLayout(2, 3));
String[] ss = { "+", "-", "*", "/" };
for (String string : ss) {
JButton jb = new JButton(string);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.append(jb.getText());
}
});
jPanel1.add(jb);
}
JButton jb = new JButton("=");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String te = jtf.getText().replaceAll("\r|\n", "");
if (null == te || te.matches("^[+,[-],*,/].*") || te.replaceAll("\r|\n", "").length() == 0
|| te.matches(".*[+,[-],*,/]$")) {
JOptionPane.showMessageDialog(jFrame, "输入有误,请检查");
return;
}
String s = te;
if (te.contains("=")) {
te.lastIndexOf("=");
s = te.substring(te.lastIndexOf("=") + 1, te.length());
}
Integer count = caclu(s);
jtf.append(jb.getText() + "\r\n");
jtf.append(count.toString());
}
});
jPanel1.add(jb);
JButton jb1 = new JButton("C/清空");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.setText("");
}
});
jPanel1.add(jb1);
c.add(jp2);
c.add(jPanel);
c.add(jPanel1);
keyLi(jFrame, jtf);//调用监听方法
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
jFrame.setLocation(40, 40);
jFrame.setSize(500, 500);
jFrame.pack();
}
//监听事件
public static void keyLi(JFrame jFrame, JTextArea jtf) {
jFrame.addKeyListener(new KeyListener() {//监听事件加到整个jframe上面
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_0) {
jtf.append("0");
}
if (e.getKeyCode() == KeyEvent.VK_1) {
jtf.append("1");
}
if (e.getKeyCode() == KeyEvent.VK_2) {
jtf.append("2");
}
if (e.getKeyCode() == KeyEvent.VK_3) {
jtf.append("3");
}
if (e.getKeyCode() == KeyEvent.VK_4) {
jtf.append("4");
}
if (e.getKeyCode() == KeyEvent.VK_5) {
jtf.append("5");
}
if (e.getKeyCode() == KeyEvent.VK_6) {
jtf.append("6");
}
if (e.getKeyCode() == KeyEvent.VK_7) {
jtf.append("7");
}
if (e.getKeyCode() == KeyEvent.VK_8) {
jtf.append("8");
}
if (e.getKeyCode() == KeyEvent.VK_9) {
jtf.append("9");
}
if (e.getKeyCode() == KeyEvent.VK_MULTIPLY) {
jtf.append("*");
}
if (e.getKeyCode() == KeyEvent.VK_MINUS) {
jtf.append("-");
}
if (e.getKeyCode() == KeyEvent.VK_PLUS) {
jtf.append("+");
}
if (e.getKeyCode() == KeyEvent.VK_DIVIDE) {
jtf.append("/");
}
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
String te = jtf.getText().replaceAll("\r|\n", "");
if (null == te || te.matches("^[+,[-],*,/].*") || te.replaceAll("\r|\n", "").length() == 0
|| te.matches(".*[+,[-],*,/]$")) {
JOptionPane.showMessageDialog(jFrame, "输入有误,请检查");
return;
}
String s = te;
if (te.contains("=")) {
te.lastIndexOf("=");
s = te.substring(te.lastIndexOf("=") + 1, te.length());
}
Integer count = caclu(s);
jtf.append("=\r\n");
jtf.append(count.toString());
}
}
});
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Swing中,键盘监听通常通过KeyListener,KeyAdapter或者更现代的Key Bindings来实现。从你的描述来看,你可能遇到了焦点问题,因为键盘事件仅在组件具有焦点时才会触发。尽管你已经设置了jtf.setFocusable(false)来禁止文本框被选中,但这可能导致键盘事件无法传递给期望接收它们的组件。
如果你想要在窗口级别捕获所有键盘事件,可以考虑将键盘监听器添加到顶层容器(如JFrame)上,因为这样不论焦点在哪里,键盘事件都能被捕捉到。这里提供一个使用KeyAdapter的基本示例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyboardDemo {
public static void main(String[] args) {
JFrame jFrame = new JFrame("计算机");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(400, 300);
jFrame.setLayout(new BorderLayout());
JTextArea jtf = new JTextArea(10, 40);
jtf.setEditable(false); // 如果不需要编辑,可以设置为不可编辑
JScrollPane jScrollPane = new JScrollPane(jtf);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jFrame.add(jScrollPane, BorderLayout.CENTER);
// 添加键盘监听到JFrame
jFrame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Key Pressed: " + e.getKeyCode());
// 在这里处理你的键盘事件
}
});
jFrame.setVisible(true);
}
}
请注意,为了使JFrame能够接收到键盘事件,你需要调用setFocusable(true)并确保JFrame获取了焦点。有时候还需要调用requestFocusInWindow()来确保框架一开始就有焦点。
此外,如果你的应用程序有复杂的键盘交互需求,推荐使用Key Bindings,它提供了更精细的控制和更好的性能,尤其是在处理焦点转移时。