Чаще всего люди спрашивают следующее: "У меня компонент рисует нечто на своей поверхности и хотелось бы запомнить данное изображение в файл или еще куда-нибудь".
Таких вопросов появляется немало и найдя вариант решения подобной задачи захотелось поделиться. Основная идея в следующем: - создать BufferedImage - получить от него его Graphics - передать данный Graphics в компонент в качестве параметра к методу paint
Ниже приведен код, который рисует на панели несложную картинку и при нажатии кнопки записывает изображение в файл.
Важно: В процессе экспериментов оказалось, что если Вы хотите что-то нарисовать на "скрытом" компоненте (например вы создали эту самую панель, но показывать ее не хотите, то надо вызывать setBounds для данного компонента и тогда все получится.
Код приведен ниже. Enjoy 
| Код | import java.io.*;
import java.io.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*;
import javax.swing.*; import javax.imageio.*;
public class test extends JFrame implements ActionListener { MyComp pnl = new MyComp(); JButton btn = new JButton("Make graph");
public test() { getContentPane().add(pnl, BorderLayout.CENTER);
btn.addActionListener(this); getContentPane().add(btn, BorderLayout.SOUTH);
setBounds(100,100,400,300); }
public static void main(String args[]) { test t = new test(); t.setDefaultCloseOperation(EXIT_ON_CLOSE); t.setVisible(true); }
public void actionPerformed(ActionEvent e) { try { BufferedImage bi = new BufferedImage(pnl.getWidth(), pnl.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = bi.getGraphics(); pnl.paint(g); FileOutputStream os = new FileOutputStream("test.png"); ImageIO.write(bi, "png", os); os.close(); JOptionPane.showMessageDialog(this, "Image is saved to file 'test.png'"); } catch(Exception ex) { ex.printStackTrace(); } } }
class MyComp extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g);
int w = getWidth(); int h = getHeight(); int od = 10; int rd = 3;
g.setColor(Color.WHITE); g.fillRect(0, 0, w, h);
g.setColor(Color.BLACK); g.drawLine(0, 0, w, h); g.drawLine(0, h, w, 0);
g.setColor(Color.BLUE); g.drawOval(w/od, h/od, w-2*w/od, h-2*h/od);
g.setColor(Color.GREEN); g.fillRect(w/rd, h/rd, w-2*w/rd, h-2*h/rd); } }
|
|