谁能告诉我 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
,它提供了更精细的控制和更好的性能,尤其是在处理焦点转移时。