为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2023-06-08 19:40:14
我正在尝试加载一个图像并在其上绘制图像,然后将其显示在框架上。我还可以将图像加载到框架上并在框架上绘图,但这会在我的屏幕上产生更多的闪烁。在下面的代码中,当用户按下任意键时屏幕会闪烁,因为图像会再次加载,并且会在上面绘制球的新位置。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){}}
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超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) {

    }

}


查看完整回答
反对 回复 2023-06-08
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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) {

    }

}


查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信