开发者社区 问答 正文

java swing键盘监听事件无效 : 配置报错

谁能告诉我     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());
				}

			}
		});
	}

展开
收起
kun坤 2020-06-03 16:14:42 1198 分享 版权
阿里云 AI 助理回答

在Swing中,键盘监听通常通过KeyListenerKeyAdapter或者更现代的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,它提供了更精细的控制和更好的性能,尤其是在处理焦点转移时。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答