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; } } }