网格组布局

   网格组布局是所有布局管理器之母,可以将网格布局看成没有任何限制的网格布局.在网格布局中,行和列的尺寸可以改变.可以将相邻的单元合并以适应较大的组件..

 

 

看图中包含下面的组件.

1两个用于字体外观和大小的组合框

2两个组合框的标签

3两个用于选择斜体和粗体的复选框

4一个显示文本的文本区

现在将容器分解为网格单元,,每个复选框横跨两列,文本区跨4行.

要想使用网格组管理器进行布局,必须经过下列过程:

1建立一个GridBagLayout的对象.不需要指定网格的列数和行数.

2将gridbaglayout对象设置成组件的布局管理器

3为每个组件建立一个gridbagConstraints对象.设置Gridbagconstraints对象的域以便指出组件在网格组中的布局方案.

4最后.通过下面调用添加组件的约束

Add(component,constraints);

 

代码如下(包含两个类,其中一个GBC类对父类gridbagConstraints 的重载)

 

package gridbag;

import javax.swing.*;

 

import java.awt.*;

import java.awt.event.*;

import java.beans.EventHandler;

public class FontFrame extends JFrame {

      public static final int TEXT_ROWS=10;

      public static final int TEXT_COLUMNS=20;

      private JComboBox face;

      private JComboBox size;

      private JCheckBox bold;

      private JCheckBox italic;

      private JTextArea sample;

      public static void main(String[] args) {

     new FontFrame();

   }

    public FontFrame()

    {

      GridBagLayout layout=new GridBagLayout();

      setLayout(layout);

      ActionListenerlistener=EventHandler.create(ActionListener.class, this,"updateSample");

      

      JLabel facelabel=new JLabel(":");

      face=new JComboBox();

      face.addItem("Serif");

      face.addItem("SansSerif");

      face.addActionListener(listener);

      JLabel sizeLabel=new JLabel("尺寸:");

      size=new JComboBox();

      size.addItem(8);

      size.addItem(10);

      size.addItem(12);

      size.addItem(15);

      size.addItem(17);

      size.addActionListener(listener);

      bold=new JCheckBox("粗体");

      bold.addActionListener(listener);

      italic=new JCheckBox("斜体");

      italic.addActionListener(listener);

      sample=new JTextArea(TEXT_ROWS,TEXT_COLUMNS);

      sample.setText("the quick brown fox jumps over the lazy dog");

      sample.setEnabled(false);

      sample.setLineWrap(true);

      sample.setBorder(BorderFactory.createEtchedBorder());

      add(facelabel,newGBC(0,0).setAnchor(GBC.EAST));

      add(face,newGBC(1,0).setFill(GBC.HORIZONTAL).setWeight(100,0).setInsets(1));

      add(sizeLabel,newGBC(0,1).setAnchor(GBC.EAST));

      add(size,newGBC(1,1).setFill(GBC.HORIZONTAL).setWeight(100, 0).setInsets(1));

      add(bold,newGBC(0,2,2,1).setAnchor(GBC.CENTER).setWeight(100, 100));

      add(italic,newGBC(0,3,2,1).setAnchor(GBC.CENTER).setWeight(100,100));

      add(sample,newGBC(2,0,1,4).setFill(GBC.BOTH).setWeight(100, 100));

      pack();

      this.setVisible(true);

      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      updateSample();

    }

    public void updateSample()

    {

      String fontFace=(String) face.getSelectedItem();

      int fontStyle=(bold.isSelected()?Font.BOLD:0)+

      (italic.isSelected()?Font.ITALIC:0);

//   int fontSize=size.getItemAt(size.getSelectedIndex());

      Font font=newFont(fontFace,fontStyle,10);

      sample.setFont(font);

      sample.repaint();

      

      

    }

    

}

这个类对gridbagcontraints的重载.

 

package gridbag;

import java.awt.*;

public class GBC extends GridBagConstraints{

    public GBC(int gridx,int gridy)

    {

      this.gridx=gridx;

      this.gridy=gridy;

    }

   public GBC(int gridx,int gridy,int gridwidth,int gridheight)

   {

     this.gridx=gridx;

     this.gridy=gridy;

     this.gridwidth=gridwidth;

     this.gridheight=gridheight;

   }

   //如果组件没有填充整个区域,可以通过设置anchor域指定其位置

   public GBC setAnchor(int anchor)

   {

     this.anchor=anchor;

     return this;

   }

   //用于填充的

   public GBC setFill(int fill)

   {

     this.fill=fill;

     return this;

    

   }

   //设置单元格的宽度

   public GBC setWeight(double weightx,double weighty)

   {    

     this.weightx=weightx;

     this.weighty=weighty;

     return this;

   }

   //可以通过设置gridbaglayoutinsets域在组件周围增加附加的空白区域

   public GBC setInsets(int distance)

   {  

     this.insets=new Insets(distance,distance,distance,distance);

     return this;

   }

   public GBC setInsets(int top,int left,int bottom,int right)

   { 

     this.insets=new Insets(top,left,bottom,right);

     return this;

   }

   //设置padding

   public GBC setIpad(int ipadx,int ipady)

   {  

     this.ipadx=ipadx;

     this.ipady=ipady;

     return this;

   }

  

}

 

 

 

附加:

 

构造方法详细信息

GridBagConstraints

public GridBagConstraints()

创建一个 GridBagConstraint 对象,将其所有字段都设置为默认值。


GridBagConstraints

public GridBagConstraints(int gridx,
                          int gridy,
                          int gridwidth,
                          int gridheight,
                          double weightx,
                          double weighty,
                          int anchor,
                          int fill,
                          Insets insets,
                          int ipadx,
                          int ipady)

创建一个 GridBagConstraints 对象,将其所有字段都设置为传入参数。注:因为使用此构造方法会妨碍源代码的可读性,所以此构造方法仅供自动源代码生成工具使用。

参数:

gridx - 初始 gridx 值。

gridy - 初始 gridy 值。

gridwidth - 初始 gridwidth 值。

gridheight - 初始 gridheight值。

weightx - 初始 weightx 值。

weighty - 初始 weighty 值。

anchor - 初始 anchor 值。

fill - 初始 fill 值。

insets - 初始 insets 值。

ipadx - 初始 ipadx 值。

ipady - 初始 ipady 值。

 

 

 

anchor

public int anchor

当组件小于其显示区域时使用此字段。它可以确定在显示区域中放置组件的位置。

可能的值有三种:相对于方向的值、相对于基线的值和绝对值。相对于方向的值是相对于容器的组件方向属性进行解释的,相对于基线值是相对于基线进行解释的,绝对值则不然。绝对值有:CENTERNORTHNORTHEASTEASTSOUTHEASTSOUTHSOUTHWESTWESTNORTHWEST。方向相对值有:PAGE_STARTPAGE_ENDLINE_STARTLINE_ENDFIRST_LINE_STARTFIRST_LINE_ENDLAST_LINE_STARTLAST_LINE_END。相对于基线的值有:BASELINEBASELINE_LEADINGBASELINE_TRAILINGABOVE_BASELINEABOVE_BASELINE_LEADINGABOVE_BASELINE_TRAILINGBELOW_BASELINEBELOW_BASELINE_LEADINGBELOW_BASELINE_TRAILING。默认值为 CENTER

fill

public int fill

当组件的显示区域大于它所请求的显示区域的大小时使用此字段。它可以确定是否调整组件大小,以及在需要的时候如何进行调整。

以下值适用于 fill

·        NONE:不调整组件大小。

·        HORIZONTAL:加宽组件,使它在水平方向上填满其显示区域,但是不改变高度。

·        VERTICAL:加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度。

·        BOTH:使组件完全填满其显示区域。

默认值为 NONE

insets

public Insets insets

此字段指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。

默认值为 new Insets(0, 0, 0,0)

ipadx

public int ipadx

此字段指定组件的内部填充,即给组件的最小宽度添加多大的空间。组件的宽度至少为其最小宽度加上ipadx 像素。

默认值为 0

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐