java canvas 随机显示不正确的图像
java canvas shows incorrect image at random
我有一个从 Canvas class 扩展而来的代码。我使用了这个 class 的两个实例。每个显示一个图像,大约每秒刷新一次的图像是什么。现在,当我只使用其中一个时,它可以正常工作,但是当同时使用它们时,它们会随机显示另一个 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;
}
}
}
原来问题出在代码的不同区域。
java 使用命令行,命令的输出存储在硬盘驱动器上,java 必须再次读取。虽然调用了 process.waitfor,但这仍然没有阻止 FileIO.read 调用读取上一张图像。一旦我添加了 FileIO.delete 命令,问题就消失了。现在我希望出现异常而不是解决这个问题,因为如果程序可以到达以前的图像,只有 p.waitfor 调用来防止它,而不是现在它被删除,而且它的时间还为时过早尝试读取图像文件。它应该无法找到该文件。但无论如何,它有效。
感谢您的光临。
我有一个从 Canvas class 扩展而来的代码。我使用了这个 class 的两个实例。每个显示一个图像,大约每秒刷新一次的图像是什么。现在,当我只使用其中一个时,它可以正常工作,但是当同时使用它们时,它们会随机显示另一个 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;
}
}
}
原来问题出在代码的不同区域。
java 使用命令行,命令的输出存储在硬盘驱动器上,java 必须再次读取。虽然调用了 process.waitfor,但这仍然没有阻止 FileIO.read 调用读取上一张图像。一旦我添加了 FileIO.delete 命令,问题就消失了。现在我希望出现异常而不是解决这个问题,因为如果程序可以到达以前的图像,只有 p.waitfor 调用来防止它,而不是现在它被删除,而且它的时间还为时过早尝试读取图像文件。它应该无法找到该文件。但无论如何,它有效。
感谢您的光临。