Bits of Java (トップ)

目次  前へ  次へ

Swing コンポーネントを保存する (その2)

前のページの SampleFrame は JFrame のサブクラスでそのコンストラクタ内でコンポーネントを貼り付けていた為にそれらのコンポーネントが XML に書き出されることがありませんでした。 下の SampleFrameBuilder は JFrame インスタンスを作成した後でコンポーネントを貼り付けているのでそれらのコンポーネントは XML に書き出されます。その為テキストフィールドへの入力値を表すプロパティを用意しなくても何か入力されていればその文字列が自動的に XML に保存されます。 しかし生成される XML のサイズは大きくなってしまいます。

前のページの SampleFrame では無名クラスとしてアクションリスナを作成してボタンに登録しています。同じ事を SampleFrameBuilder で行うとリスナの保存自体は試みられますが、無名クラスは public コンストラクタを持ちませんから XML へ書き出すことができません。 よって復元されたフレームのボタンはアクションリスナが登録されていないので押しても何も動作しなくなってしまいます。

SampleFrameBuilder は出力する XML の内容は違いますが動作自体は前のページの SampleFrame と同じです。

/******************** SampleFrameBuilder.java ********************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.beans.XMLEncoder;
import java.io.*;

public class SampleFrameBuilder implements ActionListener {

    private JFrame frame = new JFrame();

    public SampleFrameBuilder() {
        JButton xmlEncodeButton = new JButton("XMLEncode");
        xmlEncodeButton.addActionListener(this);
        JPanel panel1 = new JPanel();
        panel1.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.insets.top= 5;
        c.insets.left = 5;
        c.insets.bottom = 5;
        c.insets.right = 5;
        panel1.add(new JLabel("text : "), c);

        JTextField textField = new JTextField(20);
        c.gridx++;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.1;
        panel1.add(textField, c);
        c.gridy = 1;
        c.gridx = 1;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.EAST;
        panel1.add(xmlEncodeButton, c);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("XMLEncoder Test");
        frame.getContentPane().add(panel1);
        frame.pack();
    }

    public void actionPerformed(ActionEvent e) {
        XMLEncoder encoder = null;
        try {
            encoder = new XMLEncoder(new BufferedOutputStream(
                                         new FileOutputStream("frame.xml")));
            encoder.writeObject(frame);
            JOptionPane.showMessageDialog(frame, "frame.xmlを出力しました。");
        } catch (Exception exception) {
            exception.printStackTrace();
        } finally {
            if (encoder != null) {
                encoder.close();
            }
        }
    }

    public JFrame getFrame() {
        return frame;
    }

    public static void main(String[] args) {
        SampleFrameBuilder builder = new SampleFrameBuilder();
        builder.getFrame().setVisible(true);
    }
}

/******************** FrameDecoder.java ********************/
import java.beans.XMLDecoder;
import javax.swing.JFrame;
import java.io.*;

public class FrameDecoder {
    public static void main(String[] args) throws Exception {
        XMLDecoder decoder = null;
        try {
            decoder = new XMLDecoder(new BufferedInputStream(
                                         new FileInputStream("frame.xml")));
            JFrame frame = (JFrame)decoder.readObject();
            frame.setVisible(true);
        } finally {
            if (decoder != null) {
                decoder.close();
            }
        }
    }
}

/******************** frame.xml ********************/
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_01" class="java.beans.XMLDecoder">
 <object class="javax.swing.JFrame">
  <void property="size">
   <object class="java.awt.Dimension">
    <int>283</int>
    <int>100</int>
   </object>
  </void>
  <void property="contentPane">
   <void method="add">
    <object class="javax.swing.JPanel">
     <void method="add">
      <object id="JLabel0" class="javax.swing.JLabel">
       <void property="text">
        <string>text : </string>
       </void>
      </object>
     </void>
     <void method="add">
      <object id="JTextField0" class="javax.swing.JTextField">
       <void property="columns">
        <int>20</int>
       </void>
       <void property="text">
        <string>aaa</string>
       </void>
       <void property="document">
        <void property="documentProperties">
         <void id="Boolean0" method="get">
          <string>filterNewlines</string>
         </void>
        </void>
       </void>
      </object>
     </void>
     <void method="add">
      <object id="JButton0" class="javax.swing.JButton">
       <string>XMLEncode</string>
       <void property="model">
        <void property="armed">
         <boolean>true</boolean>
        </void>
        <void property="rollover">
         <boolean>true</boolean>
        </void>
       </void>
       <void method="addActionListener">
        <object class="SampleFrameBuilder"/>
       </void>
      </object>
     </void>
     <void property="layout">
      <object class="java.awt.GridBagLayout">
       <void method="addLayoutComponent">
        <object idref="JTextField0"/>
        <object class="java.awt.GridBagConstraints">
         <int>1</int>
         <int>0</int>
         <int>1</int>
         <int>1</int>
         <double>0.1</double>
         <double>0.0</double>
         <int>10</int>
         <int>2</int>
         <object class="java.awt.Insets">
          <int>5</int>
          <int>5</int>
          <int>5</int>
          <int>5</int>
         </object>
         <int>0</int>
         <int>0</int>
        </object>
       </void>
       <void method="addLayoutComponent">
        <object idref="JLabel0"/>
        <object class="java.awt.GridBagConstraints">
         <int>0</int>
         <int>0</int>
         <int>1</int>
         <int>1</int>
         <double>0.0</double>
         <double>0.0</double>
         <int>10</int>
         <int>0</int>
         <object class="java.awt.Insets">
          <int>5</int>
          <int>5</int>
          <int>5</int>
          <int>5</int>
         </object>
         <int>0</int>
         <int>0</int>
        </object>
       </void>
       <void method="addLayoutComponent">
        <object idref="JButton0"/>
        <object class="java.awt.GridBagConstraints">
         <int>1</int>
         <int>1</int>
         <int>1</int>
         <int>1</int>
         <double>0.1</double>
         <double>0.0</double>
         <int>13</int>
         <int>0</int>
         <object class="java.awt.Insets">
          <int>5</int>
          <int>5</int>
          <int>5</int>
          <int>5</int>
         </object>
         <int>0</int>
         <int>0</int>
        </object>
       </void>
      </object>
     </void>
    </object>
   </void>
  </void>
  <void property="defaultCloseOperation">
   <int>3</int>
  </void>
  <void property="name">
   <string>frame0</string>
  </void>
  <void property="title">
   <string>XMLEncoder Test</string>
  </void>
  <void property="visible">
   <object idref="Boolean0"/>
  </void>
 </object>
</java>