注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

千鸟

本blog所有日志均系原创 转载请注明出处

 
 
 

日志

 
 

GridBagLayout探秘  

2008-07-05 19:00:57|  分类: J2SE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

所谓的布局管理器的作用就是设置组件属性 size , LocationGridBagLayout sun推荐的最灵活也是最复杂的布局方式。今天状态不错,打算研究下这个东东。假设读者已经知道GridBagConstraints的常用属性的意义,这里只讨论这些参数按如何的优先级为GridBagLayout布局服务的。

    下面是一般的布局器的工作流程

1.       计算出各个组件的大小。

有perfersize 的属性的,计算时会的优先考虑

2.       各个布局管理器,依照自己的算法计算出各个组件的位置属性。

3.       由第3步的结果,设置组件的属性 size , Location

4.  用计算出的组件新的size , Location来确定容器的大小

5.       绘制组件。(因为布局管理器已经将size , Location属性置给了组件,所以组件中绘制自己的 时候总能知道自己的大小和位置)

 

所有的布局管理器的不同之处都在第2步,下面描述下GridBagLayout在第2步做了些什么。

 它做了两件事

一.得到格子中组件的大小,同时考虑格子的对齐原则,来计算格子的大小。每个组件的可能大小不一,但是他们在面板上处的格子总是对齐的如下图:

 

为了验证一下我所说的,只需要将GridBagConstraints的fill属性置为GridBagConstraints.BOTH就能完全填满自己的格子如图:

 

下面几个参数会影响格子的大小

1.     ipadx, ipady

在格子的原来大小上,添加新的空间。

组件变大,那所占的格子也可能变大

2.insets

分配给格子的空白区域,这个区域不会被组件所占用

3         weightx, weighty

当底层面板扩大而产生了新的区域,那这片区域如何分配给格子了?weightx, weighty越大就抢占的越多,同时格子间保持对齐。当weightx, weighty为0(默认)则表示不用让该组件所在的格子去抢占空间,所以当所有的组件都不去抢占的新的区域时,你会看见组件的相对位置、大小都不会变,保持原来的造型出现在变化后的面板的中央位置。

4.gridwidth, gridheight

把这两参数当作影响格子大小的参数,稍微有点勉强,原因看下面:

如果一个组件占的格子不只一个,那组件的大小如何影响格子大小了?

答案是影响最后一个对齐的格子。

看图来解释我说的,button5 给设置起始位置(x方向第0个格子,y方向第2个格子),设置它占3个格子,同时给它设置了一个相当大的PreferredSize,结果发现button5只影响了和它对齐的最后一个格子(即button3所在的格子,注意button3,button2的默认大小是一样的,因为button5 的原因,撑大了button3所占的格子)的大小。

 

 

二.基于格子的大小位置计算出组件的新的大小和位置。

 

1 gridx, gridy

组件占的格子从哪里开始

2.      gridwidth, gridheight

组件要占几个格子.

 

3 fill

当组件比自己的格子小的时候,怎么填充

4         anchor

当组件比自己的格子小的时候,又不填充,那该在放在那个位置

 

下面的代码稍作修改很容易看到各个属性的作用

 /*
 * GridBagLayoutDemo.java requires no other files.
 */

import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.ToolTipManager;

public class GridBagLayoutDemo {
 final static boolean shouldFill = true;
 final static boolean shouldWeightX = true;
 final static boolean RIGHT_TO_LEFT = false;

 public void addComponentsToPane(Container pane) {

  if (RIGHT_TO_LEFT) {
   pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
  }

  JButton button;
  pane.setLayout(new GridBagLayout());
  GridBagConstraints c = new GridBagConstraints();
  ShowSize show = new ShowSize();

  button = new MyButton("Button 1");
  button.addActionListener(show);
  button.setPreferredSize(new Dimension(50, 150));
  c.fill = GridBagConstraints.BOTH;//size , Location
  c.gridx = 0;
  c.gridy = 0;
  pane.add(button, c);

  c.gridheight = 1;
  button = new MyButton("Button 2");
  button.addActionListener(show);
  c.gridx = 1;
  c.gridy = 0;
  pane.add(button, c);

  button = new MyButton("Button 3");
  button.addActionListener(show);
  c.gridx = 2;
  c.gridy = 0;
  pane.add(button, c);

  button = new MyButton("Button 4");
  button.addActionListener(show);
  c.gridx = 0;
  c.gridy = 1;
  pane.add(button, c);
    
  button = new MyButton("Button 5");
  button.setPreferredSize(new Dimension(150, 50));
  button.addActionListener(show);
//  c.insets = new Insets(0, 200, 0, 0); // top padding
  c.gridx = 0;
  c.gridy = 2;
  c.gridwidth=2;
  pane.add(button, c);

 }

 class ShowSize implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {
   Component c = (Component) e.getSource();
   printSize(c);
   // c.setPreferredSize(new Dimension(50,80));
  }

 }

 class MyButton extends JButton {
  public MyButton(String name) {
   super(name);
  }

  @Override
  public void paint(Graphics g) {
   super.paint(g);
   // System.out.println(this.getText());
   // printSize(this);
  }

 }

public void printSize(Component c) {
  System.out.println(c.getName());
  System.out.println("pos-x" + c.getLocation().x);
  System.out.println("pos-y" + c.getLocation().y);
  System.out.println("size-h" + c.getSize().height);
  System.out.println("size-w" + c.getSize().width);
 }

 /**
  * Create the GUI and show it. For thread safety, this method should be
  * invoked from the event-dispatching thread.
  */
 private void createAndShowGUI() {
  // Create and set up the window.
  JFrame frame = new JFrame("GridBagLayoutDemo");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  // Set up the content pane.
  addComponentsToPane(frame.getContentPane());

  // Display the window.
  frame.pack();
  frame.setVisible(true);
 }

 public static void main(String[] args) {
  // Schedule a job for the event-dispatching thread:
  // creating and showing this application's GUI.
  javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    GridBagLayoutDemo g = new GridBagLayoutDemo();
    g.createAndShowGUI();
   }
  });
 }
}

 

  评论这张
 
阅读(1494)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017