在Java GUI中显示鼠标位置键入的字符
我有一个使用KeyListeners的Java练习,我已经坚持了一段时间。任何帮助都将不胜感激。这项工作是: “编写一个程序,从键盘获取字符输入,并显示鼠标指向的字符。” 我做了一些调试,当按下某个键时,KeyListener似乎从未注册过在Java GUI中显示鼠标位置键入的字符,java,swing,events,keylistener,Java,Swing,Events,Keylistener,我有一个使用KeyListeners的Java练习,我已经坚持了一段时间。任何帮助都将不胜感激。这项工作是: “编写一个程序,从键盘获取字符输入,并显示鼠标指向的字符。” 我做了一些调试,当按下某个键时,KeyListener似乎从未注册过 import java.awt.*; import java.awt.event.*; import javax.swing.*; @SuppressWarnings("serial") public class EventProgrammingExerc
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);
}
}
}
谢谢。看起来您不应该将lKeyListener连接到chars面板,而应该连接到框架本身
这样,即使面板因任何原因失去焦点,KeyListener也会一直工作。只有拥有它的组件具有焦点时,KeyListener才会工作。您必须首先使您的JPanel可聚焦,即
setFocusable(true)
,然后请求它具有聚焦,即requestFocusInWindow()
我根本不用鼠标听器。如果我必须使用KeyListener,并且我知道它是有效的,我会做的是:
- 使我的JPanel可聚焦并具有焦点
- 给它一个与其大小完全相同的BuffereImage,并在其
方法中绘制它paintComponent
- 向其中添加一个KeyListener/KeyAdapter
- 在KeyAdapter中,
方法中,使用MouseInfo类获取PointerInfo对象:keyPressed
PointerInfo pInfo=MouseInfo.getPointInfo()
- 使用PointerInfo通过
pInfo.getLocation()获取屏幕上当前鼠标的位置代码>
- 在屏幕上获取图形JPanel的位置
- 使用简单的矢量图形将鼠标指针位置转换为相对于组件的位置
- 如果点位于位置边界内,则从BuffereImage获取图形对象
- 在BuffereImage中绘制字符
- 重新粉刷JPanel
“这样,即使面板因任何原因失去焦点,KeyListener也会一直工作”不,不会。窃取焦点的组件将阻止通知任何其他密钥侦听器。如果您在框架顶部放置另一个可以保持键盘焦点的组件(如
JTable
),框架将永远不会接收键盘焦点,更不用说它不可焦点(从一个很少的键盘放置开始)…谢谢,这非常有帮助。如果它有助于解决问题,请回答。
chars.addMouseMotionListener(new MouseLocListener());
chars.setFocusable(true);
chars.requestFocusInWindow();