• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JFrameの最小サイズ
#navi(../)
*JFrameの最小サイズ [#u3b1e41a]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-09-25~
更新日:&lastmod;
Posted by [[terai]] at 2003-09-25

#contents

**概要 [#b7281904]
JFrameやJDialogの最小サイズを指定します。

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

#screenshot

**サンプルコード [#i2728958]
#code{{
 final Dimension minDim = new Dimension(256, 100);
 JFrame frame = new JFrame() {
   public void validate() {
     Rectangle rect = getBounds();
     if(minDim.width>rect.width || minDim.height>rect.height) {
       int mw = ((minDim.width>rect.width)?minDim.width:rect.width);
       int mh = ((minDim.height>rect.height)?minDim.height:rect.height);
       setBounds(rect.x, rect.y, mw, mh);
     }
     super.validate();
   }
 };
//1.6以上で有効
frame.setMinimumSize(new Dimension(320, 240));

//ComponentListenerを使用
final int mw = 256;
final int mh = 100;
final JFrame frame = new JFrame();
frame.addComponentListener(new ComponentAdapter() {
  public void componentResized(ComponentEvent e) {
    int fw = frame.getSize().width;
    int fh = frame.getSize().height;
    frame.setSize((mw>fw)?mw:fw, (mh>fh)?mh:fh);
  }
});

//JFrame#validateをオーバーライド
//final Dimension minDim = new Dimension(256, 100);
//JFrame frame = new JFrame() {
//  public void validate() {
//    Rectangle rect = getBounds();
//    if(minDim.width>rect.width || minDim.height>rect.height) {
//      int mw = ((minDim.width>rect.width)?minDim.width:rect.width);
//      int mh = ((minDim.height>rect.height)?minDim.height:rect.height);
//      setBounds(rect.x, rect.y, mw, mh);
//    }
//    super.validate();
//  }
//};
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#nb3f1b60]
上記のサンプルでは、JFrameなどを縮小する際の最小サイズを設定しています。この制限を超えて縮小しようとしても、マウスを放した時点で設定した最小サイズまでフレームの大きさは戻されます。ただし、フレーム周囲の飾りやタイトルバーのサイズも含まれる点に注意してください。
上記のサンプルでは、JFrameなどを縮小する際の最小サイズを設定しています。

最大サイズを制限したい場合も、同じ要領で実装することができます。
JDK 1.6 以上の場合、JFrame#setMinimumSizeメソッドを使用することで、最小サイズを指定することができます。

addComponentListenerを使ってもサンプルと同様のことができます。
JDK 1.5 で、JFrame#setMinimumSizeメソッドを使う場合は、JFrame.setDefaultLookAndFeelDecorated(true)、かつウインドウのリサイズに応じてレイアウトを再評価するようにしておく必要があるようです。
#code{{
 final int mw = 256;
 final int mh = 100;
 final JFrame frame = new JFrame();
 frame.addComponentListener(new ComponentAdapter() {
   public void componentResized(ComponentEvent e) {
     int fw = frame.getSize().width;
     int fh = frame.getSize().height;
     frame.setSize((mw>fw)?mw:fw, (mh>fh)?mh:fh);
   }
 });
JFrame.setDefaultLookAndFeelDecorated(true);
Toolkit.getDefaultToolkit().setDynamicLayout(true);
}}

JFrameに追加するJPanelにsetMinimumSize(new Dimension(500, 500))と書いても、レイアウトマネージャがそのサイズを参照しないので意味がありません。
JFrame#setMinimumSizeメソッドを使わず、ComponentListenerでサイズを制限する場合は、この制限を超えて縮小しようとしても、マウスを放した時点で設定した最小サイズまでフレームの大きさは戻されます。

JFrame#setMinimumSizeメソッドを使用する場合は、JFrame.setDefaultLookAndFeelDecorated(true)として、ウインドウのリサイズに応じてレイアウトを再評価するようにしておくと指定した最小サイズ以下にはならないようです。
#code{{
 JFrame.setDefaultLookAndFeelDecorated(true);
 Toolkit.getDefaultToolkit().setDynamicLayout(true);
}}
最大サイズを制限したい場合も、同じ要領で実装することができます。

**参考リンク [#z43489b3]
-[[Have JFrame respect the minimum size (stop resizing) - Partial solution>http://forum.java.sun.com/thread.jspa?threadID=762041]]
-[[DynamicLayoutでレイアウトの動的評価>Swing/DynamicLayout]]

JDK 6 以上で実行すれば、上記のように動的評価をするようにしなくても、JFrame#setMinimumSizeを設定するだけで、最小サイズの指定が出来るようになっています。

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