SWING COMPONENTS의 저장과 재구성

Java SE 2003/08/05 14:45 Posted by Sun

J2SE 1.4 의 릴리즈 이전에는 모든 스윙 컴포넌트는 "이후 릴리즈 될 스윙은 long term persistence 을 지원할 것이다."라고 약속했다. 이는 "모든 자바빈의 long term storage에 대한 지원은 1.4버전에서 java.beans 패키지에 추가되었다."는 메세지로 바뀌었다.

java.beans 패키지의 XMLEncoder클래스는 XML 파일에 자바빈을 존속시키고 스윙 컴포넌트를 저장하는 방법을 제공한다. 스윙 컴포넌트를 저장한 후에는 java.beans패키지의 XMLDecoder클래스를 이용해서 컴포넌트를 재구성할 수가 있다.

FrameCreator프로그램은 JFrame을 생성하고 사용자 설정을 하고 있다. main()메소드는 XMLEncoder객체를 생성하고, 이것을 이용해서 JFrame의 XML버전을 Frame.xml파일에 저장한다.

   import javax.swing.*;
   import java.awt.*;
   import java.awt.event.ActionListener;
   import java.beans.XMLEncoder;
   import java.beans.EventHandler;
   import java.io.BufferedOutputStream;
   import java.io.FileOutputStream;

   public class FrameCreator {
      public static JFrame createFrame() {
        JFrame jFrame = new JFrame();
        jFrame.setTitle("My Frame");
        jFrame.setSize(200, 100);
        JPanel jPanel = new JPanel();
        jFrame.getContentPane().add(jPanel);
        Controller controller = new Controller();
        JButton button1 = new JButton("Hello, world");
        button1.addActionListener(
          (ActionListener) EventHandler.create(
            ActionListener.class, controller,
            "helloWorld"));
        JButton button2 = new JButton(
            "Goodbye, cruel world");
        button2.setBackground(Color.RED);
        button2.addActionListener(
          (ActionListener) EventHandler.create(
            ActionListener.class, controller,
            "exit"));
        jPanel.add(button1);
        jPanel.add(button2);
        jFrame.setVisible(true);
        return jFrame;
      }

      public static void main(String[] args)
                                    throws Exception {
        XMLEncoder encoder = new XMLEncoder(
            new BufferedOutputStream(
                new FileOutputStream("Frame.xml")));
        encoder.writeObject(createFrame());
        encoder.close();
      }
   }

FrameCreator는 non-GUI클래스인 Controller.java에 정의된 메소드를 호출한다. 제어 Controller 클래스는;

   public class Controller {
        public void helloWorld() {
            System.out.println("Hello, world");
        }

        public void exit() {
            System.exit(0);
        }
   }

Frame.xml 컨텐츠를 보면 FrameCreator클래스에 설정되어 있는 속성들을 쉽게 확인할 수 있다. JFrame의 디멘존(dimension)이 저장되는 것을 주목할 필요가 있다. JFrame안에 저장된 JPanel에 관한 정보들과 JPanel의 구성 요소인 2개의 Jbuttons(Controller클래스의 인스턴스에 링크되어 있다.)이 파일안에 저장되어 있다.

   <?xml version="1.0" encoding="UTF-8"?>
   <java version="1.4.1_01" class="java.beans.XMLDecoder">
     <object class="javax.swing.JFrame">
      <void property="size">
       <object class="java.awt.Dimension">
        <int>200</int>
        <int>100</int>
       </object>
      </void>
      <void property="contentPane">
       <void method="add">
        <object class="javax.swing.JPanel">
         <void method="add">
          <object class="javax.swing.JButton">
           <string>Hello, world</string>
           <void method="addActionListener">
            <object class="java.beans.EventHandler"
                    method="create">
             <class>java.awt.event.ActionListener</class>
             <object id="Controller0" class="Controller"/>
             <string>helloWorld</string>
            </object>
           </void>
          </object>
         </void>
         <void method="add">
          <object class="javax.swing.JButton">
           <string>Goodbye, cruel world</string>
           <void property="background">
            <object class="java.awt.Color">
             <int>255</int>
             <int>0</int>
             <int>0</int>
             <int>255</int>
            </object>
           </void>
           <void method="addActionListener">
            <object class="java.beans.EventHandler"
                    method="create">
             <class>java.awt.event.ActionListener</class>
             <object idref="Controller0"/>
             <string>exit</string>
            </object>
           </void>
          </object>
         </void>
        </object>
       </void>
      </void>
      <void property="name">
       <string>frame0</string>
      </void>
      <void property="title">
       <string>My Frame</string>
      </void>
      <void property="visible">
       <boolean>true</boolean>
      </void>
     </object>
   </java>

이를 이용해 Frame.xml파일로부터 형성된 JFrame를 놀랍도록 쉽게 재구성할 수 있다. 다음의 FrameRecreator프로그램을 보면 XMLDecoderFrame.xml파일을 읽고 있는 것을 알 수 있고, 이를 실행하면 FrameCreator에서 생성/ 구성되었던 것과 같은 JFrame를 보게 된다.

   import java.beans.XMLDecoder;
   import java.io.BufferedInputStream;
   import java.io.FileInputStream;

   public class FrameRecreator {

      public static void main(String[] args)
                                    throws Exception {
        XMLDecoder decoder = new XMLDecoder(
            new BufferedInputStream(
                new FileInputStream("Frame.xml")));
        decoder.readObject();
        decoder.close();
      }
   }
Frame Recreator

XMLEncoderXMLDecoder을 이용해서 JavaBeans을 저장하고 복구하는 방법을 살펴보았다. 하지만 XMLEncoderXMLDecoder는 이 예제에세 다루는 것보다 훨씬 더 광범위하게 사용된다. XMLEncoder는 모든 프리미티브 데이터타입, 날짜, 스트링, 어레이, 리스트,hashmaps(primitive data types, dates, strings, arrays, lists, )그리고 JavaBeans이 아닌 J2SE SDK 의 클래스들을 저장하기 위해 미리 구성된다. JavaBeans이 아니더라도, 사용자만의 자바 클래스들을 저장하기 위해 XMEncoder를 형성할 수도 있다. 이 테크닉에 대해 좀 더 알고 싶다면, 스윙 커넥션의 다음 아티클을 참고한다.

사용자의 persistence techniques에 XMLEncoder를 추가하려면, Core Java Technologies Tech Tips의 "Using the Preferences API" July 15 issue에서 설명했던 Preferences API를 참고한다.

"Java SE" 카테고리의 다른 글

2003/08/05 14:45 2003/08/05 14:45

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/263

댓글을 달아 주세요

  1. 박기형  수정/삭제  댓글쓰기

    몰랐던 정보를 알게 되니 기분 좋네요.

    2007/09/19 02:14
  2. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 06:23
  3. 진정미  수정/삭제  댓글쓰기

    한단계 업~하고 갑니다 ~

    2007/09/19 23:14
  4. 장진우  수정/삭제  댓글쓰기

    오호-
    이런 정보가 있었다니... 감사합니다.

    2008/06/27 17:04
  5. 김준혁  수정/삭제  댓글쓰기

    많은 도움이 되었습니다. 감사합니다.

    2008/07/16 22:01
[로그인][오픈아이디란?]