0

我的问题是球一旦移动就会变成一条线。
这是代码:

package Java;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class javagame extends JFrame {

    private Image dbImage;
    private Graphics dbg;

    int x, y;

    public class AL extends KeyAdapter {
        public void keyPressed (KeyEvent e) {

            int keyCode = e.getKeyCode();
            if(keyCode == e.VK_LEFT) {
                x-= 5;
            }
            if(keyCode == e.VK_RIGHT) {
                x+= 5;
            }
            if(keyCode == e.VK_UP) {
                y-= 5;
            }
            if(keyCode == e.VK_DOWN) {
                y+= 5;
            }
        }
        public void keyReleased (KeyEvent e) {
        }
    }

    public javagame() {
        addKeyListener(new AL());

        setTitle("Java Game");
        setSize(750, 750);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        x = 250;
        y = 250;
    }

    public void paint(Graphics g) {
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paintCompenent(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }

    public void paintComponent (Graphics g){
        g.drawString("Copy Right All rights reserved to Aaron Collins 2013-2013", 275, 100);
        g.drawLine(270, 105, 415, 105);

        g.fillOval(x, y, 15, 15);

        repaint();
    }

    public static void main(String[] args) {
        new javagame();
    }
}

当我说它变成一条线时,我的意思是球移动但不会移除前一个。
请帮助我解决问题,以便我可以继续我的游戏!

4

1 回答 1

3
  1. 您覆盖paint,但从不调用super.paint,这意味着该组件永远不会为新的绘制周期准备 Graphics 上下文,这意味着您之前绘制的内容仍然存在
  2. 你的paintComponent方法永远不会被调用,因为JFrame不支持这个方法
  3. 您不应该在顶级容器(如JFrame)上执行自定义绘画,而应该使用类似的东西JPanel并覆盖它的paintComponent方法(确保super.paintComponent先调用)。
  4. paintXxx您还应该避免在您覆盖的任何方法中调用任何可能触发重绘的方法......比如repaint

Graphics上下文是一种共享资源,这意味着您获得的上下文Graphics用于在您之前绘制 UI 中的所有其他组件。 paintComponent负责Graphics通过清除要绘制的区域来准备绘制的上下文。

我建议您阅读自定义绘画

我也会避免KeyListener使用Key Bindings API

于 2013-06-17T23:36:07.070 回答