public BufferedImage createImage(JPanel panel) {
//Get top-left coordinate of drawPanel w.r.t screen
Point p = new Point(0, 0);
SwingUtilities.convertPointToScreen(p, panel);
//Get the region with width and height of panel and
// starting coordinates of p.x and p.y
Rectangle region = panel.getBounds();
region.x = p.x;
region.y = p.y;
//Get screen capture over the area of region
BufferedImage bi = null;
try {
bi = new Robot().createScreenCapture( region );
} catch (AWTException ex) {
Logger.getLogger(MyPaintBrush.class.getName()).log(Level.SEVERE, null, ex);
}
return bi;
}
现在,我希望能够将图像加载回JPanel drawPanel
。以下是我的尝试,但它不起作用:
try {
BufferedImage img = ImageIO.read(new File("D:\\Work Space\\Java\\Eclipse\\MyPaintBrush\\MyImage.png"));
JLabel picLabel = new JLabel(new ImageIcon(img));
drawPanel.add(picLabel);
} catch (IOException e) {
e.printStackTrace();
}
请告诉我它是如何完成的。
答案 0 :(得分:0)
您需要更改创建url对象的方法。
URL url = getClass().getResource(saveImage);
getResource()
方法不是为访问磁盘上的文件而设计的,而是在jar / war中。我会跳过这一行并直接打开一个文件,因为它在文件系统上:
BufferedImage img = ImageIO.read(new File("/path/to/file/name.png"));
请记住为文件系统使用正确的路径格式。
答案 1 :(得分:0)
我花了一整天的时间来弄清楚(在这里需要很多帮助)如何将JPanel的bufferedimage保存到我的硬盘上。我使用以下代码来执行此操作:
我更喜欢使用Screen Image类。它被打包为可重用的类。此外,JComponent()的paint()方法比使用Robot更快。
现在,我希望能够将图像加载回JPanel drawPanel。
创建文件时,您没有指定所有目录信息,所以当您尝试读取文件时,为什么要对目录路径进行硬编码。只需使用相同的文件名即可读取用于编写文件的字段。
以下是使用ScreenImage类编写图像并立即读取图像的示例:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;
public class ImageReload extends JPanel implements ActionListener
{
JLabel timeLabel;
JLabel imageLabel;
ImageIcon icon = new ImageIcon("timeLabel.jpg");
public ImageReload()
{
setLayout( new BorderLayout() );
timeLabel = new JLabel( new Date().toString() );
imageLabel = new JLabel( timeLabel.getText() );
add(timeLabel, BorderLayout.NORTH);
add(imageLabel, BorderLayout.SOUTH);
javax.swing.Timer timer = new javax.swing.Timer(1000, this);
timer.start();
}
public void actionPerformed(ActionEvent e)
{
timeLabel.setText( new Date().toString() );
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
String imageName = "timeLabel.jpg";
BufferedImage image = ScreenImage.createImage(timeLabel);
ScreenImage.writeImage(image, imageName);
imageLabel.setIcon( new ImageIcon(ImageIO.read( new File(imageName) ) ) );
}
catch(Exception e)
{
System.out.println( e );
}
}
});
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new ImageReload() );
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
请注意,此版本只会更改标签的图标。如果要在可见的GUI上创建新的JLabel,那么您还需要在面板上调用revalidate(),以便标签具有适当的绘制大小。