GridBagLayout 小结

整合GridBagLayout 的使用
从网上找Java Look&Feel ,找到了JTattoo,很不错的开源皮肤包,
在学习皮肤的同时还可以从demo代码中学习一些Swing编程相关内容。
GridBagLayout 布局管理器在网上查找相关资料时大多说这个布局管理器
很好很强大,但是比较复杂。JTattoo中也用到了GridBagLayout布局管理器,
不过他们使用了一个名叫GridBagHelper的类来帮助使用GridBagLayout,
代码如下(中文注释是我添加的...再次感谢强大的网络资源..):

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

/**
 * Hilfsklasse fuer das Einfuegen von Swing-Komponenten in ein Panel mit
 * GridBagLayout.
 *
 * @author Michael Hagen
 */
public final class GridBagHelper {

    private static final int MAXGRIDX = 511; // Eigentlich
                                             // GridBagLayout.MAXGRIDX
    private static final int MAXGRIDY = 511; // Eigentlich
                                             // GridBagLayout.MAXGRIDY
    private static final int VER_SEP_DIST = 4;
    private static final int HOR_FIELD_DIST = 4;
    private static final int VER_FIELD_DIST = 2;

    private GridBagHelper() {
        super();
    }

    /**
     * Methode zum Einfuegen einer Komponente in ein Panel mit GridBagLayout.
     * Diese Methode erfrodert zwar eine Menge Parameter, ist aber immer noch
     * besser als den ganzen Salmon fuer jede Komponente erneut hinzuschreiben.
     *
     * @param panel
     *            Panel in das eingefuegt werden soll
     * @param c
     *            Komponente die eingefuegt werden soll
     * @param x      组件的横向坐标
     *            Spalte in der eingefuegt werden soll
     * @param y   组件的纵向坐标
     *            Zeile in die eingefuegt werden soll
     * @param width   组件的横向宽度,也就是指组件占用的列数,这与HTML的colspan类似
     *            Breite der Komponente in Spalten
     * @param height  组件的纵向长度,也就是指组件占用的行数,这与HTML的rowspan类似
     *            Hoehe der Komponente in Zeilen
     * @param ipadx  组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值
     *            Anzahl Pixel die der minimalen Komponentenbreite hinzugefuegt
     *            wird
     * @param ipady  组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值
     *            Anzahl Pixel die der minimalen Komponentenhoehe hinzugefuegt
     *            wird
     * @param weightx  指行的权重,告诉布局管理器如何分配额外的水平空间
     *            Mass fuer die zusaetzliche Flaeche in horizontaler Richtung
     *            die dieser Komponente ggf. zur Verfuegung gestellt wird
     * @param weighty  指列的权重,告诉布局管理器如何分配额外的垂直空间
     *            Mass fuer die zusaetzliche Flaeche in vertikaler Richtung die
     *            dieser Komponente ggf. zur Verfuegung gestellt wird
     * @param fill  如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充
     *            Art und Weise in der die Komponente zusaetzlichen Platz nutzt
     * @param anchor  告诉布局管理器组件在表格空间中的位置
     *            Position innerhalb der virtuellen Zelle (Zeile/Spalte) an der
     *            die Komponente festgemacht wird
     */
    public static void addComponent(JPanel panel, Component c, int x, int y, int width, int height, int ipadx, int ipady, double weightx, double weighty, int fill, int anchor) {
        int dx = 0;
        int dy = 0;
        if (c instanceof JSeparator) {
            dy = VER_SEP_DIST; //4
        } else {
            dx = HOR_FIELD_DIST; //4
            dy = VER_FIELD_DIST;  //2
        }
        addComponent(panel, c, x, y, width, height, ipadx, ipady, dx, dy, weightx, weighty, fill, anchor);
    }

    /**
     * Einfuegen von Komponenten in ein Gridbaglayout
     *
     * @param panel
     *            Panel in das eingefuegt werden soll
     * @param c
     *            Komponente die eingefuegt werden soll
     * @param x      组件的横向坐标
     *            Spalte in der eingefuegt werden soll
     * @param y   组件的纵向坐标
     *            Zeile in die eingefuegt werden soll
     * @param width   组件的横向宽度,也就是指组件占用的列数,这与HTML的colspan类似
     *            Breite der Komponente in Spalten
     * @param height  组件的纵向长度,也就是指组件占用的行数,这与HTML的rowspan类似
     *            Hoehe der Komponente in Zeilen
     * @param ipadx  组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值
     *            Anzahl Pixel die der minimalen Komponentenbreite hinzugefuegt
     *            wird
     * @param ipady  组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值
     *            Anzahl Pixel die der minimalen Komponentenhoehe hinzugefuegt
     *            wird
     * @param weightx  指行的权重,告诉布局管理器如何分配额外的水平空间
     *            Mass fuer die zusaetzliche Flaeche in horizontaler Richtung
     *            die dieser Komponente ggf. zur Verfuegung gestellt wird
     * @param weighty  指列的权重,告诉布局管理器如何分配额外的垂直空间
     *            Mass fuer die zusaetzliche Flaeche in vertikaler Richtung die
     *            dieser Komponente ggf. zur Verfuegung gestellt wird
     * @param fill  如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充
     *            Art und Weise in der die Komponente zusaetzlichen Platz nutzt
     * @param anchor  告诉布局管理器组件在表格空间中的位置
     *            Position innerhalb der virtuellen Zelle (Zeile/Spalte) an der
     *            die Komponente festgemacht wird
     */
    public static void addComponent(JPanel panel, Component c, int x, int y, int width, int height, int ipadx, int ipady, int dx, int dy, double weightx, double weighty, int fill, int anchor) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.ipadx = (c instanceof JComboBox) ? Math.max(4, ipadx) : ipadx;
        gbc.ipady = (c instanceof JTextField) ? Math.max(6, ipady) : ipady;
        gbc.insets = new Insets(dy, dx, dy, dx);
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbc.fill = fill;
        gbc.anchor = anchor;

        panel.add(c, gbc);
    }

    /**
     * Methode um eine Spalte in einem Panel mit GridBagLayout auf eine feste
     * Breite einzustellen.
     *
     * @param panel
     *            Panel das eingestellt werden soll
     * @param col
     *            Spalte die eingestellt werden soll
     * @param width
     *            Breite in Pixeln
     */
    public static void setMinColWidth(JPanel panel, int col, int width) {
        JPanel sizePanel = new JPanel();
        sizePanel.setOpaque(false);
        sizePanel.setMinimumSize(new Dimension(width, 1));
        sizePanel.setPreferredSize(new Dimension(width, 1));
        sizePanel.setMaximumSize(new Dimension(width, 1));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = col;
        gbc.gridy = MAXGRIDY;
        panel.add(sizePanel, gbc);
    }

    /**
     * Methode um eine Zeile in einem Panel mit GridBagLayout auf eine feste
     * Hoehe einzustellen.
     *
     * @param panel
     *            Panel das eingestellt werden soll
     * @param row
     *            Zeile die eingestellt werden soll
     * @param height
     *            Hoehe in Pixeln
     */
    public static void setMinRowHeight(JPanel panel, int row, int height) {
        JPanel sizePanel = new JPanel();
        sizePanel.setOpaque(false);
        sizePanel.setMinimumSize(new Dimension(1, height));
        sizePanel.setPreferredSize(new Dimension(1, height));
        sizePanel.setMaximumSize(new Dimension(1, height));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = MAXGRIDX;
        gbc.gridy = row;
        panel.add(sizePanel, gbc);
    }
}

我们主要用到了第二个 addComponent 方法
使用时首先声明布局管理器
GradBagLayout layout = new GridBagLayout();

需要添加的各种组件
JPanel mainPanel = new JPanel(layout);
JButton testButton1 = new JButton("test1");
JButton testButton2 = new JButton("test2");

//集成, 各个参数还需要微调一下,看到效果才能理解注释。
GridBagHelper.addComponent(mainPanel, testButton1, 0, 1, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);
GridBagHelper.addComponent(mainPanel, testButton2, 0, 2, 1, 1, 1, 0, 0.0, 0.0, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);


注:
①,以上文字是使用记事本编辑,可能复制过去有中文字符(GridBagHelper除外),见谅...
②,个人水平有限。
③,感谢JTattoo开发团队。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值