还有点梦想 2021-02-19 19:21 采纳率: 50%
浏览 58

JPanel绘制多张Image图片时,绘制的图片出现错乱怎么回事

JPanel绘制多张Image图片时,实现动态效果时,多线程调用repaint(),绘制的图片出现错乱怎么回事?哪位大神有空帮忙指点一二,不胜感激。

材料图片:

 

代码如下: 

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Description: Test
 * Created by yjh on 2021/2/19 18:08
 */
public class Test {

    public static void main(String[] args) throws IOException {
        JFrame jFrame = new JFrame();
        jFrame.setSize(480,480);
        jFrame.setLocationRelativeTo(null);// 设置 JFrame 窗口置于屏幕的中央
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭退出

        int cs = 32;
        final int[] imgStatus = {0};
        JPanel jPanel1 = new JPanel(null){
            // 图片
            Image image100 = ImageIO.read(new File("D:/aaa/100.png"));
            Image image102 = ImageIO.read(new File("D:/aaa/102.png"));

            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                g2.setPaint(Color.black);// 背景颜色
                g2.fillRect(0, 0, getWidth(), getHeight());
                for (int y = 0; y < 15; y++) {
                    for (int x = 0; x < 15; x++) {
                        if (x<8)
                            g.drawImage(image100,x*cs,y*cs,x*cs+cs,y*cs+cs,
                                    imgStatus[0]*cs,0,imgStatus[0]*cs+cs,cs,this);
                        else
                            g.drawImage(image102,x*cs,y*cs,x*cs+cs,y*cs+cs,
                                    imgStatus[0]*cs,0,imgStatus[0]*cs+cs,cs,this);
                    }
                }
            }
        };
        jPanel1.setPreferredSize(new Dimension(480,480));
        jFrame.add(jPanel1);
        jFrame.setVisible(true);

        int top = jFrame.getInsets().top;// 获取菜单栏的高度
        int bottom = jFrame.getInsets().bottom;
        int left = jFrame.getInsets().left;
        int right = jFrame.getInsets().right;
        jFrame.setSize(480+left+right,480+top+bottom);
        jFrame.repaint();

        ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor();//创建一个单个线程的线程
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                if (imgStatus[0] >3){
                imgStatus[0] = 0;
                }
                imgStatus[0]++;
                jPanel1.repaint();
            }
        },0,500,TimeUnit.MILLISECONDS);// 0.5秒执行一次
    }
}

正常情况图片如下: 

 

 

执行等待一会就会出现,错乱了,变成红色的图片没有了,这个是怎么回事?怎么解决?:

 

 

  • 写回答

3条回答 默认 最新

  • 幻灰龙 2021-02-19 19:37
    关注

    你需要使用双缓存机制渲染。

    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码