图像在JFrame中闪烁

时间:2011-10-02 22:19:40

标签: java buffer jframe flicker

我非常沮丧,因为我使用了从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);
        }
    }

1 个答案:

答案 0 :(得分:2)

您正在阅读的内容是在JPanel的paintComponent方法中绘制,而不是在JFrame中绘制。否则你会失去双缓冲和其他Swing好东西的好处,所以我相信并遵循它。然后将JPanel添加到您的JFrame。

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