• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:PersistenceServiceを使ってJFrameの位置・サイズを記憶
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-03-26
*PersistenceServiceを使ってJFrameの位置・サイズを記憶 [#da09cfeb]
ServiceManagerからPersistenceServiceを取得し、JFrameなどの位置・サイズの保存、呼び出しを行います。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh6.googleusercontent.com/-PyOW5DW5kHU/T3APD_Cq_bI/AAAAAAAABKk/i9eivMuQZ0Y/s800/PersistenceService.png)

**サンプルコード [#xdef909f]
#code{{
final WindowState ws = new WindowState();
SwingWorker<WindowAdapter,Void> worker = new SwingWorker<WindowAdapter,Void>() {
  @Override public WindowAdapter doInBackground() {
    PersistenceService ps;
    BasicService bs;
    try{
      bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
      ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService");
    }catch(UnavailableServiceException use) {
      use.printStackTrace();
      ps = null;
      bs = null;
    }
    if(ps != null && bs != null) {
      final PersistenceService persistenceService = ps;
      final URL codebase = bs.getCodeBase();
      loadWindowState(persistenceService, codebase, ws);
      return new WindowAdapter() {
        @Override public void windowClosing(WindowEvent e) {
          JFrame f = (JFrame)e.getComponent();
          if(f.getExtendedState()==JFrame.NORMAL) {
            ws.setSize(f.getSize());
            ws.setLocation(f.getLocationOnScreen());
          }
          saveWindowState(persistenceService, codebase, ws);
        }
      };
    }else{
      return null;
    }
  }
  @Override public void done() {
    WindowAdapter wa = null;
    try{
      wa = get();
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(Exception e) {
      e.printStackTrace();
    }
    JFrame frame = new JFrame();
    if(wa!=null) frame.addWindowListener(wa);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MainPanel());
    frame.setSize(ws.getSize());
    frame.setLocation(ws.getLocation());
    frame.setVisible(true);
  }
};
worker.execute();
}}

**解説 [#p124cd93]
上記のサンプルでは、PersistenceServiceで確保したファイルに、HashMap<String, Serializable>に格納したJFrameの位置、サイズをXMLEncoder、XMLDecoderを使って読み書きしています。

----
- Windows 7, JDK 1.7.0_03 では、C:\Users\(user)\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\muffin 以下に mufファイルなどが作成されるようです。

#code{{
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.7.0_03" class="java.beans.XMLDecoder"> 
 <object class="java.util.HashMap"> 
  <void method="put"> 
   <string>location</string> 
   <object idref="Point0"/> 
  </void> 
  <void method="put"> 
   <string>size</string> 
   <object idref="Dimension0"/> 
  </void> 
 </object> 
</java> 
}}

**参考リンク [#m74e8dfc]
- [http://pscode.org/jws/api.html JWS javax.jnlp.* API demos]
- [http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/javaws/developersguide/examples.html#PersistenceService PersistenceService]
- [http://www.finnw.me.uk/persistencetest.html PersistenceService Demo]

**コメント [#x92d06e4]
#comment