java canvas随机显示不正确的图像

Posted

技术标签:

【中文标题】java canvas随机显示不正确的图像【英文标题】:java canvas shows incorrect image at random 【发布时间】:2021-12-17 16:04:57 【问题描述】:

我有一个从 Canvas 类扩展而来的代码。我使用了这个类的两个实例。每个显示一个图像,大约每秒刷新一次的图像是什么。现在,当我只使用其中一个时,它可以正常工作,但同时使用它们时,它们会随机显示另一个 Canvas 的图像。

感谢任何帮助

    package com.imagedisplay;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.Color;
import java.io.File;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.KeyStroke;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JFileChooser;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.AbstractAction;
import javax.swing.event.MenuListener;
import javax.swing.event.MenuEvent;
import java.awt.image.BufferedImage;

import com.gamedeconstructor.image.ImageEngine;
import com.util.Timer;

public class View3d extends Canvas 

    //the current rendering.
    BufferedImage bImage;
    //the parent panel, its width and height used.
    JPanel parent;

    public View3d(JPanel inParent)
    
        setupBufferStrategy();

        parent = inParent;

        revalidate();
        repaint();
    

    public void setImage(BufferedImage inImage)
    
        bImage = inImage;
        render();
    

    @Override
    public void paint(Graphics g)
    
        super.paint(g);
        render();
    

    public void render()
    
        BufferStrategy bs = this.getBufferStrategy();
        if(bImage!=null)
        
            Graphics g = bs.getDrawGraphics();
            BufferedImage scaled = ImageEngine.scale(bImage,parent.getWidth(),parent.getHeight());
            setSize(parent.getWidth(),parent.getHeight());
            g.drawImage(scaled,0,0,null);
            g.dispose();
            bs.show();
        
    

    public void setupBufferStrategy()
    
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null)
        
            this.createBufferStrategy(1);
            return;
        
    

【问题讨论】:

【参考方案1】:

问题出在代码的不同区域。

java 使用命令行,命令的输出存储在硬盘驱动器上,然后 java 必须再次读取该驱动器。虽然调用了 process.waitfor,但这仍然没有阻止 FileIO.read 调用读取前一个图像。一旦我添加了 FileIO.delete 命令,问题就消失了。现在我希望出现一个异常而不是解决这个问题,因为如果程序可以到达上一个图像,那么只有一个 p.waitfor 调用来防止这种情况,而不是现在它被删除了,而且它尝试这样做还为时过早读取图像文件。它应该找不到文件。但无论如何,它有效。

感谢您的光临。

【讨论】:

“问题出在代码的不同区域。”这就是问题应该包含minimal reproducible example的原因之一。

以上是关于java canvas随机显示不正确的图像的主要内容,如果未能解决你的问题,请参考以下文章

HTML Canvas 不显示图像

用canvas绘制的饼状图,6等分,颜色随机

在 react-canvas-draw 中绘制到图像库 64

新年第一个目标一张表盘串讲所有canves的知识点

使用 html2canvas 将 div 捕获到图像中

Tkinter 错误:无法识别图像文件中的数据