猿问

如何修复由于加载图像而导致的屏幕闪烁?

我正在尝试加载一个图像并在其上绘制图像,然后将其显示在框架上。我还可以将图像加载到框架上并在框架上绘图,但这会在我的屏幕上产生更多的闪烁。


在下面的代码中,当用户按下任意键时屏幕会闪烁,因为图像会再次加载,并且会在上面绘制球的新位置。


if up_key y--

if down_key y++

if left_key x--

if right_key x++

根据按下的键重新显示图像并更新球的位置。


如何减少闪烁效果以使其平滑?


我在文件构造函数中给出的路径必须被替换。


import java.awt.*;

import java.io.*;

import java.awt.image.*;

import javax.imageio.ImageIO;

import java.awt.event.*;


class MyFrame extends Frame implements KeyListener 

{

    BufferedImage img;

    int x=100,y=100;

    public MyFrame()

    {

        super("Box");

        this.setSize(1382,784);

        this.setVisible(true);

        this.addKeyListener(this);

        this.requestFocus();

        this.setResizable(false);

    }

    public void make()

    {

        try{

        img=ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));

        Graphics gfx=img.getGraphics();

        gfx.setColor(Color.black);

        gfx.fillOval(x,y,40,40);

        }

        catch(IOException io){}

    }

    @Override

    public void paint(Graphics g)

    {

        make();

        g.drawImage(img,0,0,getWidth(),getHeight(),null);

    }

    public static void main(String $[])

    {

        MyFrame f=new MyFrame();

        f.make();

        f.repaint();

    }


    public void keyPressed(KeyEvent key)

    {

        boolean found=false;


        if(key.getKeyCode()==KeyEvent.VK_UP)

        {

            found=true;

            y--;

        }

        if(key.getKeyCode()==KeyEvent.VK_DOWN)

        {

            found=true;

            y++;

        }

        if(key.getKeyCode()==KeyEvent.VK_LEFT)

        {

            found=true;

            x--;

        }

        if(key.getKeyCode()==KeyEvent.VK_RIGHT)

        {

            found=true;

            x++;

        }

                    if(found)

        repaint();

    }

    public void keyTyped(KeyEvent key){}

    public void keyReleased(KeyEvent key){}

}


拉风的咖菲猫
浏览 154回答 2
2回答

森林海

img您每次调用时都在设置变量值repaint(),这会导致闪烁。而是在你的构造函数中初始化它一次。在这种情况下也不需要额外的 make 方法。这应该有效:import java.awt.*;import java.io.*;import java.awt.image.*;import javax.imageio.ImageIO;import java.awt.event.*;class MyFrame extends Frame implements KeyListener {    BufferedImage img;    int x = 100, y = 100;    public MyFrame() {        super("Box");        this.setSize(480, 480);        this.setVisible(true);        this.addKeyListener(this);        this.requestFocus();        this.setResizable(false);        try {            img = ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));           } catch (IOException io) {            io.printStackTrace();        }    }    @Override    public void paint(Graphics g) {        super.paint(g);        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);        g.setColor(Color.black);        g.fillOval(x, y, 40, 40);    }    public static void main(String $[]) {        MyFrame f = new MyFrame();        f.repaint();    }    public void keyPressed(KeyEvent key) {        boolean found = false;        if (key.getKeyCode() == KeyEvent.VK_UP) {            found = true;            y--;        }        if (key.getKeyCode() == KeyEvent.VK_DOWN) {            found = true;            y++;        }        if (key.getKeyCode() == KeyEvent.VK_LEFT) {            found = true;            x--;        }        if (key.getKeyCode() == KeyEvent.VK_RIGHT) {            found = true;            x++;        }        if (found) {            repaint();        }    }    public void keyTyped(KeyEvent key) {    }    public void keyReleased(KeyEvent key) {    }}

慕桂英546537

import java.awt.*;import java.io.*;import java.awt.image.*;import javax.imageio.ImageIO;import java.awt.event.*;class MyFrame extends Frame implements KeyListener {    BufferedImage img;    Image _img;    Graphics gfx;    int x = 100, y = 100;    public MyFrame() {    super("Box");    this.setSize(1000,780);    this.setVisible(true);    this.addKeyListener(this);    this.requestFocus();    this.setResizable(false);    try {        img = ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));       } catch (IOException io) {        io.printStackTrace();    }    _img=createImage(getWidth(),getHeight());    gfx=_img.getGraphics();    }    @Override    public void paint(Graphics g) {        if(img!=null){        gfx.drawImage((Image)img,0,0,getWidth(),getHeight(),this);        gfx.fillOval(x,y,30,30);        g.drawImage(_img, 0, 0, getWidth(), getHeight(), this);        try        {            Thread.sleep(70);        }catch(Exception e){System.out.println(e);}        }    }    public static void main(String $[]) {        MyFrame f = new MyFrame();        f.repaint();    }    public void keyPressed(KeyEvent key) {    boolean found = false;        if (key.getKeyCode() == KeyEvent.VK_UP) {            found = true;            y-=2;        }        if (key.getKeyCode() == KeyEvent.VK_DOWN) {            found = true;            y+=2;        }        if (key.getKeyCode() == KeyEvent.VK_LEFT) {            found = true;            x-=2;        }        if (key.getKeyCode() == KeyEvent.VK_RIGHT) {            found = true;            x+=2;        }        if (found) {            repaint();        }    }    public void keyTyped(KeyEvent key) {    }    public void keyReleased(KeyEvent key) {    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答