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

时间:2014-02-08 00:23:49

标签: java swing events keylistener

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

    }

}

感谢。

3 个答案:

答案 0 :(得分:4)

KeyListener仅在拥有它的组件具有 焦点 时才有效。您必须首先使您的JPanel具有焦点,即setFocusable(true),然后请求它具有焦点,即requestFocusInWindow()

我根本不会使用MouseListener。如果我必须使用KeyListener,而且我所知道的有效,那么我会做的是:

  • 让我的JPanel成为焦点并具有焦点
  • 给它一个恰好是它的大小的BufferedImage,并用paintComponent方法绘制它。
  • 向其添加KeyListener / KeyAdapter
  • 在KeyAdapter中,keyPressed方法,使用MouseInfo类获取PointerInfo对象:PointerInfo pInfo = MouseInfo.getPointInfo()
  • 使用PointerInfo通过pInfo.getLocation();
  • 获取当前鼠标在屏幕上的位置
  • 获取绘图JPanel的locationOnScreen。
  • 使用简单的矢量图形将鼠标指针位置转换为相对于组件的位置。
  • 如果该点位于该位置的边界,请从BufferedImage
  • 获取Graphics对象
  • 在BufferedImage中绘制字符
  • 重绘JPanel

答案 1 :(得分:2)

看看@Hovercraft,你忘了添加MouseLocListener。比它的工作:)

chars.addMouseMotionListener(new MouseLocListener());
chars.setFocusable(true);
chars.requestFocusInWindow();

答案 2 :(得分:-1)

看起来您应该将lKeyListener附加到字符面板而不是框架本身。

这样,即使面板损失因任何原因而集中,KeyListener也会一直工作。