TITLE:JFrameの最小サイズ

JFrameの最小サイズ

編集者:Terai Atsuhiro~

作成日:2003-09-25
更新日:2022-07-07 (木) 14:16:48
  • category: swing folder: MinimumFrame title: JFrameの最小サイズ tags: [JFrame, JDialog] author: aterai pubdate: 2003-09-22 description: JFrameやJDialogの最小サイズを指定します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTP41PdCsI/AAAAAAAAAes/cxniHSm55rQ/s800/MinimumFrame.png

概要

JFrameJDialogの最小サイズを指定します。

概要

JFrameやJDialogの最小サイズを指定します。

サンプルコード

#spanend
#spanadd
// JDK 1.6.0 以上で有効
#spanend
#spanadd
frame.setMinimumSize(new Dimension(320, 150));
#spanend
#spanadd
View in GitHub: Java, Kotlin

#screenshot

解説

上記のサンプルでは、JFrameなどを縮小する際の最小サイズを設定しています。

サンプルコード

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();
  }
};
  • JDK 1.6.0以上の場合、JFrame#setMinimumSize(...)メソッドで最小サイズが指定可能
  • JDK 1.5.0JFrame#setMinimumSize(...)メソッドを使う場合は、JFrame.setDefaultLookAndFeelDecorated(true)、かつウィンドウのリサイズに応じてレイアウトを再評価する設定が必要
    #spanend
    #spanadd
    JFrame.setDefaultLookAndFeelDecorated(true);
    #spanend
    #spanadd
    Toolkit.getDefaultToolkit().setDynamicLayout(true);
    #spanend
    #spanadd
    
  • &jnlp;
  • &jar;
  • &zip;
    • -
  • JFrame#setMinimumSize(...)JFrame#setMaximumSize(...)メソッドが無効な環境の場合、以下のようにComponentListenerでサイズを制限する方法がある

解説

上記のサンプルでは、JFrameなどを縮小する際の最小サイズを設定しています。この制限を超えて縮小しようとしても、マウスを放した時点で設定した最小サイズまでフレームの大きさは戻されます。ただし、フレーム周囲の飾りやタイトルバーのサイズも含まれる点に注意してください。
#spanend
#spanadd
int mw = 320;
#spanend
#spanadd
int mh = 100;
#spanend
#spanadd
JFrame frame = new JFrame();
#spanend
#spanadd
frame.addComponentListener(new ComponentAdapter() {
#spanend
  @Override 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);
  }
#spanadd
});
#spanend
#spanadd
最大サイズを制限したい場合も、同じ要領で実装することができます。
  • -
addComponentListenerを使ってもサンプルと同様のことができます。
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);
  }
});
#spanend
#spanadd
import java.awt.*;
#spanend
#spanadd
import java.awt.event.*;
#spanend
#spanadd
import javax.swing.*;
#spanend

#spandel
JFrameに追加するJPanelにsetMinimumSize(new Dimension(500, 500))と書いても、レイアウトマネージャがそのサイズを参照しないので意味がありません。
#spanend
#spanadd
public class MaximumSizeTest {
#spanend
  private static final int MAX = 500;
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }

#spandel
JFrame#setMinimumSizeメソッドを使用する場合は、JFrame.setDefaultLookAndFeelDecorated(true)として、ウインドウのリサイズに応じてレイアウトを再評価するようにしておくと指定した最小サイズ以下にはならないようです。
#spanend
 JFrame.setDefaultLookAndFeelDecorated(true);
 Toolkit.getDefaultToolkit().setDynamicLayout(true);
-[[Java Technology Forums - Have JFrame respect the minimum size (stop resizing) - Partial solution>http://forum.java.sun.com/thread.jspa?threadID=762041]]
-[[DynamicLayoutでレイアウトの動的評価>Swing/DynamicLayout]]
  public static void createAndShowGUI() {
    final JFrame frame = new JFrame();
    frame.setMinimumSize(new Dimension(240, 120));
    Robot r;
    final Robot r2;
    try {
      r = new Robot();
    } catch (AWTException ex) {
      r = null;
    }
    r2 = r;
    frame.getRootPane().addComponentListener(new ComponentAdapter() {
      @Override public void componentResized(ComponentEvent e) {
        Point loc   = frame.getLocationOnScreen();
        Point mouse = MouseInfo.getPointerInfo().getLocation();
        if (r2 != null && (mouse.getX() > loc.getX() + MAX ||
                           mouse.getY() > loc.getY() + MAX)) {
          r2.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
          frame.setSize(Math.min(MAX, frame.getWidth()),
                        Math.min(MAX, frame.getHeight()));
        }
      }
    });
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
#spanadd
}
#spanend
#spanadd

コメント

参考リンク

コメント