Java 图像在帧中闪烁

Java 图像在帧中闪烁,java,buffer,jframe,flicker,Java,Buffer,Jframe,Flicker,我很沮丧,因为我使用了从一本关于Java的书中获得的知识为我的程序设置并绘制JFrame,但似乎世界上没有其他人以同样的方式设置它,解决它的唯一方法是大量重新编码。救命啊 我的程序出现了可怕的图像闪烁。我不知道如何摆脱它。我知道如何双缓冲一个小程序,但这不是一个小程序,所以它对我没有好处。我有一组永远不会改变的图像(P1_xxx),然后我有一个“背景”(不确定这是正确的术语)图像,当其他变量改变时会改变。也就是说,当运动员完成圈数时。它们都闪烁着。很多这是密码 我读过的所有内容几乎都回答了我的问

我很沮丧,因为我使用了从一本关于Java的书中获得的知识为我的程序设置并绘制JFrame,但似乎世界上没有其他人以同样的方式设置它,解决它的唯一方法是大量重新编码。救命啊

我的程序出现了可怕的图像闪烁。我不知道如何摆脱它。我知道如何双缓冲一个小程序,但这不是一个小程序,所以它对我没有好处。我有一组永远不会改变的图像(P1_xxx),然后我有一个“背景”(不确定这是正确的术语)图像,当其他变量改变时会改变。也就是说,当运动员完成圈数时。它们都闪烁着。很多这是密码

我读过的所有内容几乎都回答了我的问题,但旨在以不同的方式设置JFrame,在JPanel或类似的东西中

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

public class Game extends JFrame {
//all images
    URL url1=null, url2=null, url3=null, url4=null, urlhome1=null;
    Image img1,img2,img3,img4,home1;
    //screen width
    final int WIDTH = 1080, HEIGHT = 726;
    //car
    Rectangle p1 = new Rectangle(390,620,WIDTH/35,WIDTH/35);
    //constructor
    public Game() {
        //create the JFrame
        super("Racer Doom Squared");
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        //load the urls
        try {
            url1 = this.getClass().getResource("Images/P1_Up.png");
            url2 = this.getClass().getResource("Images/P1_Right.png");
            url3 = this.getClass().getResource("Images/P1_Down.png");
            url4 = this.getClass().getResource("Images/P1_Left.png");
            urlhome1 = this.getClass().getResource("Images/Home1.png");
        }
        catch(Exception e){}
        //attach URLs to Images
        img1 = Toolkit.getDefaultToolkit().getImage(url1);
        img2 = Toolkit.getDefaultToolkit().getImage(url2);
        img3 = Toolkit.getDefaultToolkit().getImage(url3);
        img4 = Toolkit.getDefaultToolkit().getImage(url4);
        home1 = Toolkit.getDefaultToolkit().getImage(urlhome1);
    public void paint(Graphics g){
        super.paint(g);
        if(p1Laps==0) {
        //home1
        g.drawImage(home1,0,0,WIDTH,HEIGHT,this);
        }
        int scale = (WIDTH/HEIGHT)*3;
        //Up
        int p1width1 = img1.getWidth(this);
        int p1height1 = img1.getHeight(this);
        int w1 = scale*p1width1;
        int h1 = scale*p1height1;
        //Right
        int p1width2 = img2.getWidth(this);
        int p1height2 = img2.getHeight(this);
        int w2 = scale*p1width2;
        int h2 = scale*p1height2;
        //Down
        int p1width3 = img3.getWidth(this);
        int p1height3 = img3.getHeight(this);
        int w3 = scale*p1width3;
        int h3 = scale*p1height3;
        //Left
        int p1width4 = img4.getWidth(this);
        int p1height4 = img4.getHeight(this);
        int w4 = scale*p1width4;
        int h4 = scale*p1height4;
        if(p1Direction==UP) {
            g.drawImage(img1,p1.x,p1.y,(int)w1,(int)h1,this);
        }
        if(p1Direction==RIGHT) {
            g.drawImage(img2,p1.x,p1.y,(int)w2,(int)h2,this);
        }
        if(p1Direction==DOWN) {
            g.drawImage(img3,p1.x,p1.y,(int)w3,(int)h3,this);
        }
        if(p1Direction==LEFT) {
            g.drawImage(img4,p1.x,p1.y,(int)w4,(int)h4,this);
        }
    }

您正在阅读的内容是告诉您使用JPanel的paintComponent方法,而不是JFrame。否则,您将失去双缓冲和其他Swing功能的好处,因此我相信并遵循它。然后将JPanel添加到JFrame中


如果这仍然让人困惑,请询问,但也要提供更多信息。

要更快获得更好的帮助,请发布一个。对于使用图像的SSCCE,可以在代码中生成图像,或者热链接到网络上可用的一些(小)图像。一些变量没有声明,它们是
p1Laps
p1Direction
UP
RIGHT
DOWN
LEFT
“我读过的所有内容几乎都回答了我的问题”什么问题?在这些单词中,我没有看到任何“?”。@Eng.Fouad以及那些,缺少2
}
URL
的导入。我担心这一点。谢谢你。@speakr:没什么好怕的。无论如何,您应该更多地关注于创建JPanel,而不是JFrames。它们更加灵活,因为您可以轻松地将它们放入JFrames,或JApplets、JDialogs、JTabbedPanes、其他JPanel,。。。对于JFrame来说,情况就不一样了。知道这一点很好!我将寻找一个关于将JFrame转换为JPanel的教程。非常感谢你这几天的帮助。