在现有图形的基础上绘制Java图形

在现有图形的基础上绘制Java图形,java,image,graphics,Java,Image,Graphics,主要类别: public Main() { Frame f = new Frame(); final Panel p = f.p; final Player player = new Player(); Timer t = new Timer(UPDATE_PERIOD, new ActionListener() { public void actionPerformed(ActionEvent e) { Gra

主要类别:

    public Main() {
    Frame f = new Frame();
    final Panel p = f.p;

    final Player player = new Player();

    Timer t = new Timer(UPDATE_PERIOD, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Graphics g = p.getGraphics();
            p.render(g);

            player.tick();
            player.render(g);

            g.dispose();
        }
    });
    t.start();
}
播放器渲染方法:

public void render(Graphics g) {
    g.drawImage(Images.get("player"), x, y, null);
}
问题是,所有以前绘制的图像仍然存在。示例(当我更改绘制图像的x或y方向时):

与使用计时器进行自定义渲染不同,您实际上应该使用paintComponent方法进行所有绘制。比如:

   public void actionPerformed(ActionEvent e) {            
        player.tick();
        p.repaint();
    }
然后在paintComponent()中重新渲染播放器和背景


当您调整面板大小时,像您当前这样的绘制会遇到问题,等等

与使用计时器进行自定义渲染相比,您实际上应该使用paintComponent方法进行所有绘制。比如:

   public void actionPerformed(ActionEvent e) {            
        player.tick();
        p.repaint();
    }
然后在paintComponent()中重新渲染播放器和背景


当您调整面板大小等时,像当前一样绘制会遇到问题。要在
Swing
中绘制,不应直接从JPanel获取
图形
对象。相反,请重写
paintComponent
方法,并使用参数图形对象执行自定义绘图,同时调用父方法以擦除以前的绘图

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    //custom painting goes here
}
如果希望触发重新绘制,请在JPanel上使用该名称的方法:

p.repaint();

要绘制
Swing
,您不应该直接从JPanel获取
图形
对象。相反,请重写
paintComponent
方法,并使用参数图形对象执行自定义绘图,同时调用父方法以擦除以前的绘图

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    //custom painting goes here
}
如果希望触发重新绘制,请在JPanel上使用该名称的方法:

p.repaint();

更改图形位置后,请尝试在ActionListener中调用“p.repaint()”

更改图形位置后,请尝试在ActionListener中调用“p.repaint()”

再次绘制之前需要清除上一个绘图:
g.clearRect(0,0,getWidth(),getHeight())如果您想要的答案不是猜测性的,则需要使用“更多”更新问题。现在,我们并不真正理解您的代码在做什么。(p.getGraphics()
做什么?你在画什么?@Radiodef p是扩展JPanel的类。getGraphics()来自超类。这将是一个小游戏,我刚刚开始,正在尝试,那么你已经收到了答案。(不要那样画。)你也应该看看我的答案:它展示了一种更合适的游戏画图方法,并且有其他示例的链接。你需要在再次画图之前清除上一张图:
g.clearRect(0,0,getWidth(),getHeight())如果您想要的答案不是猜测性的,则需要使用“更多”更新问题。现在,我们并不真正理解您的代码在做什么。(p.getGraphics()
做什么?你在画什么?@Radiodef p是扩展JPanel的类。getGraphics()来自超类。这将是一个小游戏,我刚刚开始,正在尝试,那么你已经收到了答案。(不要那样画。)你也应该看看我的答案:它展示了一种更合适的游戏绘画方法,并与其他示例有链接。