レイアウトの小技

[prev : フォントを統一する] [up : SwingTips]

GridBagLayoutでコンポーネントがつぶれるのを防ぎたいとき〜


GridBagLayoutを使って画面をレイアウトすると、
文字列入力コンポーネント(JTextFieldなど)はつぶれて表示されてしまいます。

その理由
GridBagLayoutはコンポーネントの最小サイズと推奨サイズからグリッドバグのサイズを求めます。
基本的には推奨サイズが使われるはずですが、コンテナとコンポーネントのサイズの関係で最小サイズが使用される場合があります。
この時、JTextField等のコンポーネントはデフォルトの最小サイズが0なので当然つぶれます。
解決法:
JComponent#setMinimumSize()というメソッドで明示的に推奨サイズを与えてあげると
コンポーネントがつぶれることはありません。
例:
import javax.swing.*;

public class TuburenaiField extends JTextfield {

    public TuburenaiField(int columns) {
        super(columns);
        setMinimumSize(getPreferredSize());      //<--ここ
    }
}
	    

GridBagLayoutでJTableを載せたJScrollPaneをレイアウトする。

JTableをJScrollPaneに貼り付けてレイアウトしたとき
妙に大きくレイアウトされて困った経験はありませんか?

GridBagLayout等のレイアウトマネージャはコンポーネントの推奨サイズもしくは最小サイズからレイアウト情報を作成します。
JTableのJScrollPaneにはりつけられた場合の推奨サイズ
(JTable#getPreferredScrollableViewPortSize()で返される値)は
450×400
となってしまいます。
すると当然大きくレイアウトされるわけですな。

では、JScrollPaneにJTableをはりつけた場合、どのようにレイアウトすればいいでしょう?
答え
BorderLayoutを設定したJPanelにJScrollPaneを貼り付けて、
JPanelをレイアウトしてあげる。

BorderLayoutは推奨サイズを無視してくれるので、BorderLayoutのパネルにJScrollPaneをはりつければ上記のトンでもない推奨サイズは消えます。
その上で、JPanelを好みのレイアウトマネージャでレイアウトしてあげればOKです。
Last modified: Wed Jun 19 10:00:07 LMT 2002