Мерцание изображения в JFrame - PullRequest
1 голос
/ 03 октября 2011

Я очень расстроен, потому что я использовал знания, полученные из книги по 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 Ответ

2 голосов
/ 03 октября 2011

То, что вы читаете, говорит о рисовании в методе paintComponent JPanel, а не в JFrame. В противном случае вы потеряете преимущества двойной буферизации и других вкусностей Swing, поэтому я бы поверил в это и следовал этому. Затем добавьте JPanel в свой JFrame.

Если это все еще смущает, пожалуйста, спросите, но также предоставьте больше информации.

...