【问题标题】:My repaint in JFrame is not working我在 JFrame 中的重绘不起作用
【发布时间】:2015-03-25 06:33:09
【问题描述】:

我在 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() 不工作?

【问题讨论】:

    标签: java swing draw keylistener repaint


    【解决方案1】:

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

    For example

    编辑:我错了,因为 JFrame 可以 获得焦点,而您正在将 KeyListener 添加到 JFrame。但是您的问题是您正在创建一个 new 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);
             }
          });
       }
    }
    

    虽然更安全的是使用键绑定。

    【讨论】:

    • 谢谢,我所要做的就是在绘图类中创建一个构造函数并执行此操作 public Draw(){ addKeyListener(this);可聚焦(真);并从框架类 addKeyListener 中删除,它可以工作 setFocusable 做到了:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2019-08-07
    • 2023-03-08
    • 1970-01-01
    • 2013-07-11
    • 2016-04-20
    相关资源
    最近更新 更多