我有一个使用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);
}
}
}
谢谢。
KeyListener只有在拥有它的组件具有焦点时才能工作。您必须首先使JPanel可聚焦,即setFocusable(true)
,然后请求它具有焦点,即requestFocusInWindow()
。
我根本不会用鼠标定位器。如果我必须使用KeyListener,我会做的是:
- 使我的JPanel焦点可用并具有焦点
- 给它一个与其大小完全相同的BufferedImage,并用它的
paintComponent
方法绘制它 - 向其中添加KeyListener/KeyAdapter
- 在KeyAdapter的
keyPressed
方法中,使用MouseInfo类获取PointerInfo对象:PointerInfo pInfo = MouseInfo.getPointInfo()
- 使用PointerInfo通过
pInfo.getLocation();
获取当前鼠标在屏幕上的位置 - 在屏幕上获取绘图JPanel的位置
- 使用简单的矢量图形将鼠标指针位置转换为相对于零部件的位置
- 如果点在位置的边界内,则从BufferedImage获取Graphics对象
- 在BufferedImage中绘制字符
- 重新喷涂JPanel
看看@Hovercraft,就会忘记添加MouseLocListener。不起作用:)
chars.addMouseMotionListener(new MouseLocListener());
chars.setFocusable(true);
chars.requestFocusInWindow();
看起来应该将lKeyListener附加到框架本身,而不是字符面板。
这样,即使面板因任何原因失去焦点,KeyListener也会一直工作。