java将图像添加到canvas

我正在尝试将图像添加到Javacanvas。 我正在使用“ImageIO.read”来获取图像源。 我面临的问题是,我不知道如何在阅读图像位置后在canvas上显示它。 稍后我将需要加载不同的图像(例如按下按钮后)我该怎么做。 更新(canvas.update)方法需要“Graphics”参数而不是图像。 下面你会发现我的代码已经简化了(我遗漏了与canvas问题无关的所有代码。)

public class MainWindow { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { window = new MainWindow(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public MainWindow() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { Canvas csStatusImage = new Canvas(); csStatusImage.setBounds(393, 36, 200, 200); frame.getContentPane().add(csStatusImage); Image iMg; try { iMg = ImageIO.read(new File("Images/Error_status_1.png")); csStatusImage.imageUpdate(iMg, 10, 2, 2, 9, 10); csStatusImage.checkImage(iMg, (ImageObserver) this); csStatusImage.createImage((ImageProducer) iMg); } catch (IOException e1) { e1.printStackTrace(); } } } 

首先,您需要某种方式来绘制图像。 要实现此目的,您可以覆盖java.awt.Canvas类的paint方法

 import java.awt.Canvas; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; public class Test { public static void main(String[] args) { new Test(); } public Test() { Frame frame = new Frame("Testing"); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.add(new ImageCanvas()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public class ImageCanvas extends Canvas { private BufferedImage img; public ImageCanvas() { try { img = ImageIO.read(new File("Images/Error_status_1.png")); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight()); } @Override public void paint(Graphics g) { super.paint(g); if (img != null) { int x = (getWidth() - img.getWidth()) / 2; int y = (getHeight() - img.getHeight()) / 2; g.drawImage(img, x, y, this); } } } } 

我必须告诉你,AWT已经过时了大约15年,取而代之的是Swing。 您可能会发现很难获得此API的额外支持。 如果可以的话,最好使用Swing或JavaFX