Swing/JPanel Contents Serialization

JPanel Contents Serialization example

Soul-Learner 2016. 8. 29. 15:39

JPanel에 그려진 다수개의 사각형을 파일에 저장하고 다시 불러오는 예


프로그램을 실행하고 화면에 드래그하면 사각형이 그려진다. 이렇게 다수개의 사각형을 그린 후에 [화면내용 저장] 버튼을 누르면 C:/test/rect.jd 파일에 내용이 저장된다. 프로그램을 다시 실행한 후에 [불러오기] 버튼을 누르면 파일에 저장된 내용을 불러와서 다시 화면에 복원하는 내용이다


package org.kdea.swing;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import java.util.*;

import javax.swing.*;
/** 화면에 드래그하여 사각형을 다수개 그린 후에 [화면내용 저장] 버튼을 눌러 파일에 저장한다
 * 프로그램을 다시 실행하여 [불러오기] 버튼을 누르면 앞서 그려진 사각형 그림이 다시 화면에 나타난다
 */
public class DrawingRestore extends JFrame 
{
	public DrawingRestore(){
		super("도형 그리면서 메모리에 저장하고 다시 복원하기");
		setBounds(10,10,540,450);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		DrawingPanel dp = new DrawingPanel();
		add(dp, BorderLayout.CENTER);
		
		JPanel northPanel = new JPanel();
		add(northPanel, BorderLayout.NORTH);
		
		JButton btnSave = new JButton("화면내용 저장");
		northPanel.add(btnSave);
		btnSave.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try{
					ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream("C:/test/rect.jd"));
					oout.writeObject(dp.rectList);
					oout.close();
					System.out.println("저장 성공");
				}catch(Exception ex){
					ex.printStackTrace();
				}
			}
		});
		
		JButton btnRestore = new JButton("불러오기");
		northPanel.add(btnRestore);
		btnRestore.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try{
					ObjectInputStream oin = new ObjectInputStream(new FileInputStream("C:/test/rect.jd"));
					java.util.List<Rect> list = (java.util.List<Rect>)oin.readObject();
					dp.rectList = list;
					dp.repaint();
					System.out.println("불러오기 성공");
				}catch(Exception ex){
					ex.printStackTrace();
				}
			}
		});
		
		setVisible(true);
	}

	public static void main(String[] args) 
	{
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				new DrawingRestore();
			}
		});
	}

	class DrawingPanel extends JPanel
	{
		Point2D start = new Point2D.Double();
		Point2D end = new Point2D.Double();
		boolean pressed;
		java.util.List<Rect> rectList = new ArrayList<>();
		
		public DrawingPanel() {
			setBackground(Color.GREEN);
			setFocusable(true);
			requestFocus();
			
			addMouseListener(new MouseAdapter() {
				@Override
				public void mousePressed(MouseEvent e) {
					pressed = true;
					start = new Point2D.Double(e.getX(), e.getY());
				}
				@Override
				public void mouseReleased(MouseEvent e) {
					pressed = false;
					end = new Point2D.Double(e.getX(), e.getY());
					rectList.add(new Rect(start,end));
					repaint();
				}
			});
			
			addMouseMotionListener(new MouseMotionAdapter(){
				@Override
				public void mouseDragged(MouseEvent e) {
					end = new Point2D.Double(e.getX(), e.getY());
					repaint();
				}
			});
		}
		
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			int sx = 0;
			int sy = 0;
			int ex = 0;
			int ey = 0;
			for(int i=0;i<rectList.size();i++){
				
				sx = (int)rectList.get(i).start.getX();
				sy = (int)rectList.get(i).start.getY();
				ex = (int)rectList.get(i).end.getX();
				ey = (int)rectList.get(i).end.getY();
				g2d.drawRect(sx, sy, ex-sx, ey-sy);
			}
			sx = (int)start.getX();
			sy = (int)start.getY();
			ex = (int)end.getX();
			ey = (int)end.getY();
			g2d.drawRect(sx, sy, ex-sx, ey-sy);
		}
	}
	
	class Rect implements Serializable
	{
		Point2D start,end;

		public Rect(Point2D start, Point2D end) {
			this.start = start;
			this.end = end;
		}

		public Point2D getStart() {
			return start;
		}

		public void setStart(Point2D start) {
			this.start = start;
		}

		public Point2D getEnd() {
			return end;
		}

		public void setEnd(Point2D end) {
			this.end = end;
		}
	}
}