`
yedaya
  • 浏览: 21243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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开发团队。

分享到:
评论

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java开发技术大全 电子版

    1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 ...

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    图形用户界面编程.pdf

    图形用户界面编程.pdf 图形用户界面编程是 Java 语言中...8. 小结 图形用户界面编程是 Java 语言中的一种重要组件,用于构建图形用户界面(GUI)。掌握图形用户界面编程的相关知识点,可以更好地构建 GUI 应用程序。

    學習JAVA入門基礎資料

    #### 小结 通过学习AWT,开发者能够掌握如何构建基本的图形用户界面,从简单的按钮到复杂的多窗口应用。理解组件、容器和布局管理器的概念是构建高效、响应式且跨平台GUI的基础。此外,熟悉Java.awt包中的类和方法...

    Java_11 Swing图形界面设计1

    6. **本章小结** 学习Swing图形界面设计,我们需要掌握GUI的基本概念,了解AWT与Swing的区别,熟练使用各种组件,理解布局管理器的工作原理,并学会编写事件处理代码。Swing提供的组件丰富多样,能够满足创建复杂...

    java课程设计计算器报告书模版(软件工程).docx

    ### 六、设计体会与小结 通过本次课程设计,不仅巩固了Java编程基础,还深入了解了GUI应用的开发流程和技术细节。特别是对于事件驱动模型的理解更加深刻,学会了如何设计合理的用户交互逻辑。此外,也意识到了代码...

    投票管理系统-java.doc

    设计体会与小结部分是开发者对整个项目经验的反思和总结,有助于提升未来项目的质量。参考文献则提供了进一步学习和研究的基础。源代码附录提供了系统实现的具体细节,对于理解和复现系统至关重要。 总的来说,这个...

    Java程序设计 5.2 图形编程之swing.pptx

    ### 小结 Swing 作为一种强大的 GUI 构建工具,不仅为开发者提供了丰富的组件库,还提供了高级的功能和灵活的布局管理机制,极大地提高了开发效率。通过了解 Swing 的基础知识及其核心组件和容器,开发者可以快速...

    java程序设计与开发课件

    1.6 本章小结································· (9) 习题1···································· (9) 第2章 Java语言基础········...

    2021-2022计算机二级等级考试试题及答案No.15160.docx

    9. 二叉树结构:在二叉树中,总结点数 = 叶子结点数 + 度为1的结点数 + 度为2的结点数,由于题目中没有给出度为2的结点数,无法直接计算,但根据题目数据,总结点数应为219。 10. 栈的特性:栈是一种后进先出(LIFO...

Global site tag (gtag.js) - Google Analytics