java - 我在 JFrame 中的重绘不起作用

标签 java swing draw keylistener repaint

我在 JFrame 中重绘有问题我之前在制作动画时使用了 repaint() 并且一切正常

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Draw extends JComponent implements KeyListener {

    int x = 0;
    int y = 0;

    public void paint(Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 50, 50);
    }

    public void keyPressed(KeyEvent k) {
        if(k.getKeyCode() == KeyEvent.VK_UP){
            y -= 2;
        } else if(k.getKeyCode() == KeyEvent.VK_DOWN){
            y += 2;
        } else if(k.getKeyCode() == KeyEvent.VK_LEFT){
            x -= 2;
        } else if(k.getKeyCode() == KeyEvent.VK_RIGHT){
            x += 2;
        }

        repaint();
    }

    public void keyReleased(KeyEvent k) {}

    public void keyTyped(KeyEvent k) {}

    }

这是我的绘图类,如果我作为小程序运行,一切正常,但我不想要小程序

我的框架类

import javax.swing.*;

public class Frame  {

    Draw d = new Draw();

    public Frame(){

        JFrame f = new JFrame("Game");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setVisible(true);

        f.add(d);
        f.addKeyListener(new Draw());
    }

}

和我的主课

public class Main {

    public static void main(String[] args) {

        Frame f = new Frame();

    }

}

repaint() 是不工作的,我测试了它工作的关键监听器,那么为什么 repaint() 不工作?

最佳答案

KeyListener 不应该 工作,因为默认情况下 JComponent 无法获得程序焦点,这是 KeyListener 工作的必要条件。一种解决方案是通过 setFocusable(true) 使其可聚焦,然后对其调用 requestFocusInWindow()。最好使用键绑定(bind) ( tutorial link )。请注意,您应该重写 paintComponent,而不是绘画,并且您不应该忘记在您的重写中调用 super 的方法。

For example

编辑:我错了,因为 JFrame 可以 获得焦点并且您正在将 KeyListener 添加到 JFrame。但是您的问题是您正在创建一个新的 Draw 对象来执行此操作,而不是针对原始显示的 Draw 对象。如果您使用相同的 Draw 对象来显示图像和 KeyListener,您的代码实际上可以工作:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Draw extends JComponent implements KeyListener {
   int x = 0;
   int y = 0;

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(Color.BLUE);
      g.fillRect(x, y, 50, 50);
   }

   public void keyPressed(KeyEvent k) {
      if (k.getKeyCode() == KeyEvent.VK_UP) {
         y -= 2;
      } else if (k.getKeyCode() == KeyEvent.VK_DOWN) {
         y += 2;
      } else if (k.getKeyCode() == KeyEvent.VK_LEFT) {
         x -= 2;
      } else if (k.getKeyCode() == KeyEvent.VK_RIGHT) {
         x += 2;
      }

      repaint();
   }

   public void keyReleased(KeyEvent k) {
   }

   public void keyTyped(KeyEvent k) {
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            Draw d = new Draw();
            JFrame f = new JFrame("Game");
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setSize(800, 600);
            f.setVisible(true);

            f.add(d);
            f.addKeyListener(d);
         }
      });
   }
}

但更安全的是使用键绑定(bind)。

关于java - 我在 JFrame 中的重绘不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157016/

相关文章:

java - 从 jar 加载自定义类时出现 ClassCastException

java - 确定用户两次单击的顺序

swing - Swing 中的 JavaFX FileChooser

java - 如何在 Jtextarea 中选择一行?

java - 如何修正我的素因数分解程序?

java - 如何在Java中的arraylist中递归所有子级

Java drawImage() 不绘图

python - 用于绘图软件的 PIL 和 Tkinter

Python OpenCV : mouse callback for drawing rectangle

android - View 的draw 方法是否可以在Android 的后台线程中运行?