我有一个使用KeyListeners的Java练习,我已经坚持了一段时间。任何帮助将不胜感激。练习是:
“编写程序以从键盘输入字符并显示鼠标指向的字符。”
我做了一些调试,似乎KeyListener在按下某个键时从不注册。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class EventProgrammingExercise10 extends JFrame {
CharPanel chars;
private int x;
private int y;
String s;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
EventProgrammingExercise10 frame = new EventProgrammingExercise10();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public EventProgrammingExercise10() {
setTitle("EventProgrammingExercise10");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
chars = new CharPanel();
chars.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
chars.repaint();
}
});
add(chars);
}
public void setX(int n) {
x = n;
}
public void setY(int n) {
y = n;
}
class MouseLocListener extends MouseMotionAdapter {
public void mouseMoved(MouseEvent e) {
setX(e.getX());
setY(e.getY());
}
}
class CharPanel extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(String.valueOf('a'), x, y);
}
}
}
感谢。
答案 0 :(得分:4)
KeyListener仅在拥有它的组件具有 焦点 时才有效。您必须首先使您的JPanel具有焦点,即setFocusable(true)
,然后请求它具有焦点,即requestFocusInWindow()
。
我根本不会使用MouseListener。如果我必须使用KeyListener,而且我所知道的有效,那么我会做的是:
paintComponent
方法绘制它。keyPressed
方法,使用MouseInfo类获取PointerInfo对象:PointerInfo pInfo = MouseInfo.getPointInfo()
pInfo.getLocation();
答案 1 :(得分:2)
看看@Hovercraft,你忘了添加MouseLocListener。比它的工作:)
chars.addMouseMotionListener(new MouseLocListener());
chars.setFocusable(true);
chars.requestFocusInWindow();
答案 2 :(得分:-1)
看起来您应该将lKeyListener附加到字符面板而不是框架本身。
这样,即使面板损失因任何原因而集中,KeyListener也会一直工作。