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

在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

我有一个使用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);
        }

    }

}

谢谢。

看起来您不应该将lKeyListener连接到chars面板,而应该连接到框架本身


这样,即使面板因任何原因失去焦点,KeyListener也会一直工作。

只有拥有它的组件具有焦点时,KeyListener才会工作。您必须首先使您的JPanel可聚焦,即
setFocusable(true)
,然后请求它具有聚焦,即
requestFocusInWindow()

我根本不用鼠标听器。如果我必须使用KeyListener,并且我知道它是有效的,我会做的是:

  • 使我的JPanel可聚焦并具有焦点
  • 给它一个与其大小完全相同的BuffereImage,并在其
    paintComponent
    方法中绘制它
  • 向其中添加一个KeyListener/KeyAdapter
  • 在KeyAdapter中,
    keyPressed
    方法中,使用MouseInfo类获取PointerInfo对象:
    PointerInfo pInfo=MouseInfo.getPointInfo()
  • 使用PointerInfo通过
    pInfo.getLocation()获取屏幕上当前鼠标的位置
  • 在屏幕上获取图形JPanel的位置
  • 使用简单的矢量图形将鼠标指针位置转换为相对于组件的位置
  • 如果点位于位置边界内,则从BuffereImage获取图形对象
  • 在BuffereImage中绘制字符
  • 重新粉刷JPanel

看看气垫船,你忘了添加鼠标滑环。比它有效:)


“这样,即使面板因任何原因失去焦点,KeyListener也会一直工作”不,不会。窃取焦点的组件将阻止通知任何其他密钥侦听器。如果您在框架顶部放置另一个可以保持键盘焦点的组件(如
JTable
),框架将永远不会接收键盘焦点,更不用说它不可焦点(从一个很少的键盘放置开始)…谢谢,这非常有帮助。如果它有助于解决问题,请回答。
chars.addMouseMotionListener(new MouseLocListener());
chars.setFocusable(true);
chars.requestFocusInWindow();