Como salvar um jframe como imagem

Olá, galera, sou novo aqui no fórum e já estou com dúvidas :(.

creio eu que minha dúvida é um pouco simples, porém não consegui saná-la com alguns tópicos aqui do forum.

Bom, tenho uma classe que cria uma janela e nessa janela eu escrevo algo a mao livre, gostaria de saber como faço para salvar essa imagem no final do desenho, que é quando o usuário solta o clique do mouse.

o código que está sendo utilizado é esse:

public class Janela extends JFrame implements MouseMotionListener, MouseListener {

/**
 *
 */
private ArrayList<Integer> x;
private ArrayList<Integer> y;

public Janela() {
    setTitle("Classificador de Dígitos");
    x = new ArrayList<>();
    y = new ArrayList<>();
    setBackground(Color.BLACK);
    addMouseMotionListener(this);
    addMouseListener(this);
    setSize(200, 200);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
    Graphics2D graphic = (Graphics2D) g;
    graphic.setColor(Color.WHITE);
    for(int i = 1; i < x.size(); i ++) { 
        graphic.drawLine(x.get(i-1), y.get(i-1), x.get(i), y.get(i));
    }
}

Obrigado a todos.

Modifiquei um pouco seu código, veja:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Janela extends JFrame {

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable t) {
			t.printStackTrace();
		}
		try {
			Janela janela = new Janela();
			janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			janela.setVisible(true);
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private List<Point> pontos = new ArrayList<>();

	private final JPanel areaDesenho = new JPanel() {
		@Override
		protected void paintComponent(Graphics g) {
			g.setColor(Color.BLACK);
			Dimension d = getSize();
			g.fillRect(0, 0, d.width, d.height);

			g.setColor(Color.WHITE);
			for (int i = 1; i < pontos.size(); i++) {
				Point p1 = pontos.get(i - 1);
				Point p2 = pontos.get(i);
				g.drawLine(p1.x, p1.y, p2.x, p2.y);
			}
		}
	};

	private final MouseAdapter listener = new MouseAdapter() {

		@Override
		public void mouseDragged(MouseEvent e) {
			adicionarPonto(e);
		}

		@Override
		public void mousePressed(MouseEvent e) {
			adicionarPonto(e);
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			adicionarPonto(e);
		}
	};

	private final JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));

	public Janela() {
		setTitle("Classificador de Dígitos");
		setLayout(new BorderLayout());
		setSize(200, 200);

		JButton botaoSalvar = new JButton("Salvar imagem");
		botaoSalvar.addActionListener(event -> salvarImagem());

		areaDesenho.addMouseListener(listener);
		areaDesenho.addMouseMotionListener(listener);
		add(areaDesenho, BorderLayout.CENTER);
		add(botaoSalvar, BorderLayout.SOUTH);
	}

	private void adicionarPonto(MouseEvent e) {
		pontos.add(new Point(e.getX(), e.getY()));
		areaDesenho.repaint();
	}

	private void salvarImagem() {
		int option = fileChooser.showSaveDialog(this);
		if (option == JFileChooser.APPROVE_OPTION) {
			try {
				File arquivo = fileChooser.getSelectedFile();
				int largura = areaDesenho.getWidth();
				int altura = areaDesenho.getHeight();
				BufferedImage imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
				Graphics graphics = imagem.getGraphics();
				areaDesenho.paint(graphics);
				ImageIO.write(imagem, "PNG", new FileOutputStream(arquivo));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Muito obrigado pela dica staroski, ontem de madrugada trabalhando um pouco eu consegui desenvolver o que eu queria, só que não sei se é a melhor forma, porém está aqui o código.

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**

  • Essa classe é responsável …
  • @author wnunes
    */
    public class Janela extends JFrame implements MouseMotionListener, MouseListener {
private ArrayList<Integer> x;
private ArrayList<Integer> y;
Janela teste;

public Janela() {
    setTitle("Classificador de Dígitos");
    x = new ArrayList<>();
    y = new ArrayList<>();
    setBackground(Color.BLACK);
    addMouseMotionListener(this);
    addMouseListener(this);
    setSize(200, 200);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
    Graphics2D graphic = (Graphics2D) g;
    graphic.setColor(Color.WHITE);
    graphic.setStroke(new BasicStroke(10));
    for(int i = 1; i < x.size(); i ++) { 
        graphic.drawLine(x.get(i-1), y.get(i-1), x.get(i), y.get(i));
    }
}

@Override
public void mouseDragged(MouseEvent e) {
    x.add(e.getX());
    y.add(e.getY());
    System.out.println(e.getX() + "," + e.getY());
    repaint();
}
public static void main(String[] args) {
    new Janela();
}
@Override
public void mouseReleased(MouseEvent e) {
            BufferedImage img = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2i = img.createGraphics();
            paint(g2i);
            g2i.dispose();                
            try {
              ImageIO.write(img, "png", new File("desenho.png"));
              BufferedImage imagem = null;
                try {
                    imagem = ImageIO.read(new File("desenho.png"));
                    System.out.println("ok");
                } catch (IOException ex) {
                    
                }
                BufferedImage new_img = new BufferedImage(28, 28, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = new_img.createGraphics();
                g2d.drawImage(imagem, 0, 0, 28, 28, null);
                ImageIO.write(new_img, "png", new File("desenho1.png"));
                System.out.println("Terminou o desenho! Deve classificar a imagem");
            }
            catch(IOException ioe) {
              System.out.println(ioe.getMessage());
            }
            
    
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}

}