zoukankan      html  css  js  c++  java
  • Java图形化界面设计——GridBagConstraints

    JAVA布局模式:GridBagConstraints终极技巧参数详解

    布局模式 :GridBagConstraints布局,先发一个实例:
    gridx = 2; // X2
    gridy = 0; // Y0
    gridwidth = 1; // 横占一个单元格
    gridheight = 1; // 列占一个单元格
    weightx = 0.0; // 当窗口放大时,长度不变
    weighty = 0.0; // 当窗口放大时,高度不变
    anchor = GridBagConstraints.NORTH; // 当组件没有空间大时,使组件处在北部
    fill = GridBagConstraints.BOTH; // 当格子有剩余空间时,填充空间
    insert = new Insets(0, 0, 0, 0); // 组件彼此的间距
    ipadx = 0; // 组件内部填充空间,即给组件的最小宽度添加多大的空间
    ipady = 0; // 组件内部填充空间,即给组件的最小高度添加多大的空间
    new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, insert, ipadx, ipady);

    GridBagLayout之变态玩法:
    很多人抱怨GridBagLayout没有XYLayout布局灵活,但是做为一个专业程序,所有组件必须随着窗口大小改变而改变。其次,当仅仅简单使用XYLayout时,需要包含一个大库,对于一些场合这些多余的类超出了可接受范围(例如Applet应用)
    拿一个比较简单的界面来作介绍
    1。首先建立一个JFrame,设定它的Layout为XYLayout
    2。在其上堆上控件,对齐好位置,否则转换时会有较大调整
    3。完成创建控件后,设置Layout为GridBagLayout,这时所有控件基本保持原位,待下一步做精细调整
    4。选择一个控件,点击右边属性栏的"constraints" 对应的调整按钮,弹出最重要的属性调整界面
    5。将所有边界和空白去掉,同时Grid大小也暂时去掉,因为这些边距会影响我们的调整
    6。设置需要扩展的行和列
    7。粗轮廓完成后,可以设置组件边距进行精细调整了
    8。精细调整完成,运行调试



    以下是GridBagLayout的详解:
    虽说GridBagLayout和GridLayout只有一点差别,它
    的作用却是出奇的大。这是因为GridBagLayout一改其他的外观管理器的死板
    模样,具有很多的灵活性。它不再像其他的外观管理器那样,使得各个组件
    的大小都一样。 GridBagLayout通过类GridBagConstraints的帮助,按照
    设计的意图,改变组件的大小,把它们摆在设计者希望摆放的位置上。

    在GridBagLayout中,每个组件都有一个GridBagConstraints
    对象来给出它的大小和摆放位置。我们在使用GridBagLayout的时候,最重
    要的就是学会使用这个类GridBagConstraints的使用方法,学会如何设置组
    件的大小、位置等限制条件。

    我们先看一个用GridBagLayout外观管理器生成的窗口




    图14.8程序14.5的执行结果


    这个窗口里面的几个按钮有的大、有的小,其大小、位
    置均不同,没有一定的规律可循,这即是发挥了GridBagLayout外观管理器
    的灵活性。生成此窗口的程序为:

    程序14.5

      importjava.awt.*;

          //输入所有的java.awt 类

      publicclasswindow7extendsjava.applet.Applet

      {

       publicvoidinit() {

        resize(300,100);//设置窗口的大小

        GridBagConstraintsgbc=new GridBagConstraints(
    );//使用类GridBagConstriants

        setLayout(newGridBagLayout());//设定外观
    管理器为 GridBagLayout外观管理器

        gbc.fill =GridBagConstraints.BOTH;//★
    所有的按钮都会把分配的剩余空间填满

        gbc.gridwidth=1;//★设置第一个按钮的大


        gbc.gridheight=1;// ★

        ButtonButton1=newButton("东 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button1,gbc);

         add(Button1);

        gbc.gridwidth= GridBagConstraints.REMAINDER;
    //★第二个按钮填满整行空间

        ButtonButton2=newButton("西 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button2,gbc);

         add(Button2);

        gbc.gridheight=4;//设置第三个按钮的大


        gbc.gridwidth= 1;

        ButtonButton3=newButton("南 ");

        ((GridBagLayout)getLayout( )).setConstraints(Button3,gbc);

         add(Button3);

        gbc.gridheight=2;//设置第四个按钮的大


        gbc.gridwidth= 2;//GridBagConstraints.REMAINDER;

         ButtonButton4=newButton("北");

         ((GridBagLayout)getLayout( )).setConstraints(Button4,gbc);

         add(Button4);

        gbc.gridwidth= GridBagConstraints.REMAINDER;

        Button Button5=newButton("中");

         ((GridBagLayout)getLayout( )).setConstraints(Button5,gbc);

         add(Button5);

        gbc.insets=new Insets(5,6,7,8);//★设置第五个按钮的位置

        ButtonButton6=newButton("好酒在张弓");

        ((GridBagLayout)getLayout( )).setConstraints(Button6,gbc);

         add(Button6);

               }

      }

      ★注释:程序14.5里面有星号的语句都将做详细的解释


    下面就详细地解释一下程序14.5,通过对这个小程序的分析可以从中了解GridBagLayout外观管理器的工作原理和工作方法。



      GridBagLayout外观管理器实际上是根据类GridBagConstraints所给
    出的条件限制以及组件本身的一向特性条件(例如每个组件程序允许的最小
    尺寸),来决定各个组件的外观的。


    让我们把程序14.5之中出现的新鲜的语句一条一条地看个明白吧:


    1.gbc.fill=GridBagConstraints.BOTH;


    每个组件有一定的原始大小,例如在类FlowLayout外
    观管理器的管理之下显示的就都是组件的本身原始大小。如果我们分配给一
    个组件的空间比它原本所需要的空间大时,就需要一定的方式方法来决定如
    何处理这一部分多余的空间。这时就用到了fill值。Java根据人们给这个
    fill设定的值来决定如何处理比组件原始空间大的那部分空间。

    fill可以取四种不同的值,它们分别代表了四种不同
    的剩余空间处理方式:

    GridBagConstraints.NONE

      不必理睬剩余空间的存在,让它空着好了。

    GridBagConstraints.BOTH

      不让一点剩余空间存在,改变组件的大小,让它填
    满分配给它的整个空间。

    GridBagConstraints.HORIZONTAL

      调整组件的大小,把水平方向的空间填满。

    GridBagConstraints.VERTICAL

      调整组件的大小,把垂直方向的空间填满,让水平
    方向的空间空着吧。


    2.gbc.gridwidth=1;和 gbc.gridheight=1;

    这两句话像是一对孪生兄弟,应该同时给以同样的重视
    。它们一个负责组件的水平宽度(gridwidth),一个负责组件的垂直高度
    (gridheight )。由此我们可以知道,组件的大小是可以变化的。

    组件的形状是不能改变的,永远是矩形的。


      好了,这两条语句的意义很简单,就讲到这里吧。

      喂!等一等,我看到下面有一条语句是:

        gbc.gridwidth= GridBagConstraints.REMAINDER;


    这是什么意思?

    怎么gridwidth的值不是一个数,而是“ GridBagConstraints.REMAINDER
    ”?

    原来,这是Java精心为大家设计的一个特别有用的变
    量,使用它就可以通知外观管理器让组件占据本行的所有剩余空间,而不必
    去计算宽度值是多少,很自动化。

    3.gbc.insets=newInsets(5,6,7,8);

    这条语句里面提到了两个拼写几乎完全相同的词:insets
    和 Insets,虽然只相差一个字母:一个是大写I,一个是小写i,但是它
    们代表的意义可大不相同。

    Insets是AWT里面一个类的名字,代表着类Insets,它的用途是用来定义组件容器周围的空间大小,其中带有四个参数:

    Insets(第一个参数,第二个参数,第三个参数,第
    四个参数 )

    第一个参数代表距上面有几个点的空白,第二个参数代
    表距左边有几个点的空白,第三个参数代表距下边有几个点的空白区域,第
    四个参数代表距右边留几个点的空白区域。

      形象一点的表示如图 14.9:


    图14.9参数的设定顺序

    insets是类GridBagConstraints的一个限定条件。

    insets和Insets既然起的名字相同,两者之间也一
    定有相同之处,它们的相似之处就在于它们的用法和用途。insets用来设置
    一个组件和其他的组件之间的距离的。所以在上面程序里的按钮和其他的按
    钮不同,它和其他的按钮之间都有一定的距离,而不是和其他的按钮挨在一
    起。

    总之,使用外观管理器给我们带来了许多的方便之处,
    使得我们可以轻轻松松地完成各种窗口的外观处理工作。

    使用外观管理器除了使得程序设计变得方便以外,还
    使得程序变得容易在各种不同的窗口环境下运行,从而协助实现了Java的多
    平台之梦。

        小结:

    学会使用各种各样的外观管理器会带来事半功倍的编
    程效果。

    这一章里新学习的类有:

    BorderLayout,CardLayout,FlowLayout,GridLayot
    ,ridBagLayout,GridBagConstraints和Insets。

    类GridBagLayout生成的外观管理器是最具有灵活性
    的外观管理器。

    类GridBagLayout需要通过类GridBagconstraints
    来实现对程序窗口外观的管理。
    =====================================================================================
     
     
     
    1. package com.wanju.chat.test;  
    2.   
    3. import java.awt.GridBagConstraints;  
    4. import java.awt.GridBagLayout;  
    5. import java.awt.Insets;  
    6.   
    7. import javax.swing.JButton;  
    8. import javax.swing.JFrame;  
    9.   
    10. public class ExampleFrame_03 extends JFrame {  
    11.   
    12.     public static void main(String args[]) {  
    13.         ExampleFrame_03 frame = new ExampleFrame_03();  
    14.         frame.setVisible(true);  
    15.     }  
    16.   
    17.     public ExampleFrame_03() {  
    18.         super();  
    19.         setTitle("使用网格组布局管理器");  
    20.         getContentPane().setLayout(new GridBagLayout());  
    21.         setBounds(100, 100, 500, 170);  
    22.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    23.   
    24.         final JButton button = new JButton("A");  
    25.         final GridBagConstraints gridBagConstraints = new GridBagConstraints();  
    26.         gridBagConstraints.gridy = 0;// 起始点为第1行  
    27.         gridBagConstraints.gridx = 0;// 起始点为第1列  
    28.         gridBagConstraints.weightx = 10;// 第一列的分布方式为10%  
    29.         gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;  
    30.         getContentPane().add(button, gridBagConstraints);  
    31.   
    32.         final JButton button_1 = new JButton("B");  
    33.         final GridBagConstraints gridBagConstraints_1 = new GridBagConstraints();  
    34.         gridBagConstraints_1.gridy = 0;  
    35.         gridBagConstraints_1.gridx = 1;  
    36.         gridBagConstraints_1.insets = new Insets(0, 5, 0, 0);// 设置组件左侧的最小距离  
    37.         gridBagConstraints_1.weightx = 20;// 第一列的分布方式为20%  
    38.         gridBagConstraints_1.fill = GridBagConstraints.HORIZONTAL;  
    39.         getContentPane().add(button_1, gridBagConstraints_1);  
    40.   
    41.         final JButton button_2 = new JButton("C");  
    42.         final GridBagConstraints gridBagConstraints_2 = new GridBagConstraints();  
    43.         gridBagConstraints_2.gridy = 0;// 起始点为第1行  
    44.         gridBagConstraints_2.gridx = 2;// 起始点为第3列  
    45.         gridBagConstraints_2.gridheight = 2;// 组件占用两行  
    46.         gridBagConstraints_2.insets = new Insets(0, 5, 0, 0);  
    47.         gridBagConstraints_2.weightx = 30;// 第一列的分布方式为30%  
    48.         gridBagConstraints_2.fill = GridBagConstraints.BOTH;// 同时调整组件的宽度和高度  
    49.         getContentPane().add(button_2, gridBagConstraints_2);  
    50.   
    51.         final JButton button_3 = new JButton("D");  
    52.         final GridBagConstraints gridBagConstraints_3 = new GridBagConstraints();  
    53.         gridBagConstraints_3.gridy = 0;  
    54.         gridBagConstraints_3.gridx = 3;  
    55.         gridBagConstraints_3.gridheight = 4;  
    56.         gridBagConstraints_3.insets = new Insets(0, 5, 0, 5);// 设置组件左侧和右侧的最小距离  
    57.         gridBagConstraints_3.weightx = 40;// 第一列的分布方式为40%  
    58.         gridBagConstraints_3.fill = GridBagConstraints.BOTH;  
    59.         getContentPane().add(button_3, gridBagConstraints_3);  
    60.   
    61.         final JButton button_4 = new JButton("E");  
    62.         final GridBagConstraints gridBagConstraints_4 = new GridBagConstraints();  
    63.         gridBagConstraints_4.gridy = 1;  
    64.         gridBagConstraints_4.gridx = 0;  
    65.         gridBagConstraints_4.gridwidth = 2;// 组件占用两列  
    66.         gridBagConstraints_4.insets = new Insets(5, 0, 0, 0);// 设置组件上方的最小距离  
    67.         gridBagConstraints_4.fill = GridBagConstraints.HORIZONTAL;// 只调整组件的宽度  
    68.         getContentPane().add(button_4, gridBagConstraints_4);  
    69.   
    70.         final JButton button_5 = new JButton("F");  
    71.         final GridBagConstraints gridBagConstraints_5 = new GridBagConstraints();  
    72.         gridBagConstraints_5.gridy = 2;// 起始点为第3行  
    73.         gridBagConstraints_5.gridx = 0;// 起始点为第1列  
    74.         gridBagConstraints_5.insets = new Insets(5, 0, 0, 0);  
    75.         gridBagConstraints_5.fill = GridBagConstraints.HORIZONTAL;  
    76.         getContentPane().add(button_5, gridBagConstraints_5);  
    77.   
    78.         final JButton button_6 = new JButton("G");  
    79.         final GridBagConstraints gridBagConstraints_6 = new GridBagConstraints();  
    80.         gridBagConstraints_6.gridy = 2;  
    81.         gridBagConstraints_6.gridx = 1;  
    82.         gridBagConstraints_6.gridwidth = 2;// 组件占用两列  
    83.         gridBagConstraints_6.gridheight = 2;// 组件占用两行  
    84.         gridBagConstraints_6.insets = new Insets(5, 5, 0, 0);  
    85.         gridBagConstraints_6.fill = GridBagConstraints.BOTH;// 只调整组件的高度  
    86. //      gridBagConstraints_6.fill = GridBagConstraints.VERTICAL;// 只调整组件的高度  
    87. //      gridBagConstraints_6.ipadx = 30;// 增加组件的首选宽度  
    88. //      gridBagConstraints_6.anchor = GridBagConstraints.EAST;// 显示在东方  
    89.         getContentPane().add(button_6, gridBagConstraints_6);  
    90.   
    91.         final JButton button_7 = new JButton("H");  
    92.         final GridBagConstraints gridBagConstraints_7 = new GridBagConstraints();  
    93.         gridBagConstraints_7.gridy = 3;  
    94.         gridBagConstraints_7.gridx = 0;  
    95.         gridBagConstraints_7.insets = new Insets(5, 0, 0, 0);  
    96.         gridBagConstraints_7.fill = GridBagConstraints.HORIZONTAL;  
    97.         getContentPane().add(button_7, gridBagConstraints_7);  
    98.         //  
    99.     }  
    100.   
    101. }  
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/aipan/p/6831872.html
Copyright © 2011-2022 走看看