java - 为什么我创建的点没有移动?

标签 java swing awt

我正在尝试通过按左右键来移动点。 这是我的主要内容:

import javax.swing.JFrame;

public class Main {

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(null);
    frame.setSize(500,500);
    Graphic graphic=new Graphic();
    frame.add(graphic);

}}

这是我创建点并实现 KeyListener 和 ActionListener 的图形类:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Graphic extends JPanel implements ActionListener, KeyListener {
private int posX = 220;
private int posY = 300;
private Timer timer;
private int delay = 8;
private int width = 500;
private int height = 500;

public Graphic() {
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    timer = new Timer(delay, this);
    timer.start();
    this.setSize(width, height);
}

public void paint(Graphics g) {
    g.setColor(Color.black);
    g.fillRect(0, 0, width, height);

    g.setColor(Color.GREEN);
    g.fillOval(posX, posY, 20, 20);
}

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {

        if (posX <= 20) {
            posX = 20;
        } else {
            moveLeft();

        }
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        if (posX >= 460) {
            posX = 460;
        } else {
            moveRight();
        }
    }
    repaint();

}

private void moveRight() {
    posX += 20;

}

private void moveLeft() {
    posX -= 20;

}

@Override
public void actionPerformed(ActionEvent e) {
    timer.start();
    repaint();

}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e) {
}

}

在我看来,这应该有效……但事实并非如此。当我按左右键时没有任何反应,看起来它没有“听”我的命令。那么,我的代码有什么问题吗?

最佳答案

如果具有监听器的组件具有焦点,

KeyListener 就会起作用。
默认情况下,当您显示 JFrame 时它具有焦点,但 JPanel 则不然。

Graphic构造函数中简单地添加grabFocus():

public Graphic() {
    addKeyListener(this);
    setFocusTraversalKeysEnabled(true);
    setFocusable(true);
    grabFocus();     
    timer = new Timer(delay, this);
    timer.start();
    this.setSize(width, height);
}
<小时/>

编辑

我已经在我的机器上测试过了。问题是它随机工作,因为如果我们希望 JPanel 捕获焦点,JFrame 需要可见。有时是,有时则不是。
SwingUtilities.invokeLater() 可能会解决该问题。

将面板添加到 JFrame 后,调用 invokeLater() 方法中获取焦点的代码。

    frame.add(graphic);
    ...
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            graphic.grabFocus();
        }
    });

关于java - 为什么我创建的点没有移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41486053/

相关文章:

java - 实现事件驱动架构的类型更安全的方法?

java - 导入maven依赖时出错

java - 根据行和列绘制一条线

java - 什么是 AWT-Windows 线程?

java - Java中的JIT编译是如何将动态编译好的指令加载到内存中的?

java - 反序列化版本冲突

java - 如何复制 JCheckBox 的禁用外观?

java - JFreechart 无法正确显示日期

java - 如何使用 Graphics 对象 g 绘制透明形状?

java.lang.错误: "Not enough storage is available to process this command" when generating images