• title: JFrameの最小サイズ tags: [JFrame, JDialog] author: aterai pubdate: 2003-09-22 description: JFrameやJDialogの最小サイズを指定します。

概要

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

サンプルコード

//1.6以上で有効
frame.setMinimumSize(new Dimension(320, 150));
View in GitHub: Java, Kotlin

解説

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

JDK 1.6以上の場合、JFrame#setMinimumSizeメソッドを使用することで、最小サイズを指定することができます。

JDK 1.5で、JFrame#setMinimumSizeメソッドを使う場合は、JFrame.setDefaultLookAndFeelDecorated(true)、かつウィンドウのリサイズに応じてレイアウトを再評価するようにしておく必要があるようです。

JFrame.setDefaultLookAndFeelDecorated(true);
Toolkit.getDefaultToolkit().setDynamicLayout(true);

JFrame#setMinimumSizeメソッドを使わず、ComponentListenerでサイズを制限する場合は、この制限を超えて縮小しようとしても、マウスを放した時点で設定した最小サイズまでフレームの大きさは戻されます。

//ComponentListenerを使用
final int mw = 320;
final int mh = 100;
final JFrame frame = new JFrame();
frame.addComponentListener(new ComponentAdapter() {
  @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);
  }
});

JFrame#setMaximumSizeが無効な環境でも、上記のようにComponentListenerを使えば最大サイズを制限する(リサイズした後で最大サイズに戻しているだけ)ことができます。


Robotを使う方法もあるようです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MaximumSizeTest{
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  private static final int MAX = 500;
  public static void createAndShowGUI() {
    final JFrame frame = new JFrame();
    frame.setMinimumSize(new Dimension(240,120));
    //frame.setMaximumSize(new Dimension(400,400));
    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_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);
  }
}

参考リンク

コメント