Index > レイアウトマネージャの自作(Java,TaExtLayout)
Tue, March 14, 2006

レイアウトマネージャの自作(Java,TaExtLayout)

プロフィールの入力フォームとか、ログイン画面の作成などで、 グリッド上にコンポーネントをレイアウトしたい場合が結構あるのだが、 AWTの標準のレイアウトマネージャでは、すぐ対応できない(ことが多い)。
そこで2列 x n行のレイアウトを簡単に作ることができるレイアウトマネージャを自作してみました。

制限事項

TaExtLayoutをセットしたコンテナには、偶数個のコンポーネントしかaddできないことに 注意してください。

完成

コード TaExtLayout.java

TaExtLayout.java

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;

public class TaExtLayout implements LayoutManager {

    public static final int TOP=0;
    public static final int MIDDLE=1;
    public static final int BOTTOM=2;

    private int _valign;
    private int _hgap,_vgap;

    public TaExtLayout(){
        this(TOP);
    }
    public TaExtLayout(int valign){
        this(valign,0,0);
    }
    public TaExtLayout(int valign,int hgap,int vgap){
        _valign=valign;
        _hgap=hgap;
        _vgap=vgap;
    }

    public void addLayoutComponent(String arg0, Component arg1) {
    }

    public void removeLayoutComponent(Component arg0) {
        // TODO Auto-generated method stub

    }
    public Dimension preferredLayoutSize(Container arg0) {
        return computelayoutSize(arg0);
    }
    public Dimension minimumLayoutSize(Container arg0) {
        return computelayoutSize(arg0);
    }
    public void layoutContainer(Container parent) {

        Component[] components=parent.getComponents();
        if(components.length==0 || components.length%2!=0){
            System.out.println("error"+components.length);
            return ;
        }

        Insets insets=parent.getInsets();


        Dimension size=null;
        {
            Dimension s=parent.getSize();

            //親コンポーネントのInsetsを考慮します.
            size=new Dimension( s.width-(insets.left+insets.right),s.height-(insets.top+insets.bottom) );
        }

        int w1=size.width;
        int w2=(int)getMaxWidthSize(components);
        int w_left=Math.min(w1,w2);
        w_left=w_left+_hgap;

        int w_right=size.width-w_left;


        Component c;

        int hosei=0;
        if(_valign==MIDDLE){
            Dimension mysize=computelayoutSize(parent);
            int myh=parent.getHeight();
            hosei=(myh-mysize.height)/2;
        }
        else if(_valign==BOTTOM){
            Dimension mysize=computelayoutSize(parent);
            int myh=parent.getHeight();
            hosei=(myh-mysize.height);
        }

        int currentY=0;
        for(int i=0; i<components.length; i++){
            if(i%2==0){
                int h0=components[i].getPreferredSize().height;
                int h1=components[i+1].getPreferredSize().height;
                int currentH=Math.max(h0,h1);

                c=components[i];
                int x=0;
                int y=hosei+0+currentY;
                int width=w_left;
                //c.setBounds(x,y,width,currentH);
                c.setBounds(x+insets.left,y+insets.top,width,currentH);

                currentY=currentY+currentH+_vgap;
            }
        }

        currentY=0;
        for(int i=0; i<components.length; i++){
            if(i%2!=0){
                int h0=components[i-1].getPreferredSize().height;
                int h1=components[i].getPreferredSize().height;
                int currentH=Math.max(h0,h1);

                c=components[i];
                int x=w_left;
                int y=hosei+0+currentY;
                int width=w_right;
                //c.setBounds(x,y,width,currentH);
                c.setBounds(x+insets.left,y+insets.top,width,currentH);

                currentY=currentY+currentH+_vgap;
            }
        }
    }
    private double getMaxWidthSize(Component[] children){

        double w=0;
        for(int i=0; i<children.length; i++){
            if(i%2==0){
                double w1=children[i].getPreferredSize().getWidth();
                w=Math.max(w,w1);
            }
        }
        return w;
    }

    private Dimension computelayoutSize(Container parent){//,int hpad,int vpad){


        Component[] components=parent.getComponents();
        if(components.length==0 || components.length%2!=0){
            System.out.println("error");
            return new Dimension(0,0);
        }

        int w=0;
        for(int i=0; i<components.length; i++){
            if(i%2==0){
                int w1=components[i].getPreferredSize().width;
                int w2=components[i+1].getPreferredSize().width;
                w=Math.max(w,w1+w2);
            }
        }

        int h=0;

        for(int i=0; i<components.length; i++){
            if(i%2==0){
                int h0=components[i].getPreferredSize().height;
                int h1=components[i+1].getPreferredSize().height;
                h+=Math.max(h0,h1);
            }
        }


        {
            w=w+_hgap;
            int count=components.length/2;
            h=h+(count)*_vgap;
        }


        //親コンポーネントのInsetsを考慮します。
        Insets insets=parent.getInsets();
        return new Dimension( w+(insets.left+insets.right),h+(insets.top+insets.bottom) );
    }
}

使用例

Test1.java

import java.awt.*;
import javax.swing.*;

public class Test1 extends JPanel{

    public Test1(){
        super(); 
        setLayout(new TaExtLayout(TaExtLayout.MIDDLE,5,3));

        add(new JLabel("name:"));
        add(new JTextField());

        add(new JLabel("emal:"));
        add(new JTextField());

        add(new JLabel("address:"));
        add(new JTextField());
    }
    public Insets getInsets(){
        return new Insets(10,10,10,10);
    }
}
 Twitter
follow me on Twitter
 Categories