在Java GUI中显示在鼠标位置键入的字符



我有一个使用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也会一直工作。

最新更新