zoukankan      html  css  js  c++  java
  • 深入学习GridBagLayout

    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    
    
    public class GridBagWindow extends JFrame {
      private JButton searchBtn;
      private JComboBox modeCombo;
      private JLabel tagLbl;
      private JLabel tagModeLbl;
      private JLabel previewLbl;
      private JTable resTable;
      private JTextField tagTxt;
     public GridBagWindow() {
       Container contentPane = getContentPane();
       GridBagLayout gridbag = new GridBagLayout();
       contentPane.setLayout(gridbag);
       GridBagConstraints c = new GridBagConstraints();
       //setting a default constraint value
       c.fill =GridBagConstraints.HORIZONTAL;
       tagLbl = new JLabel("Tags");
       c.gridx = 0; //x grid position
       c.gridy = 0; //y grid position
       gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object 
       contentPane.add(tagLbl); //add it to content pane
       
       tagModeLbl = new JLabel("Tag Mode");
       c.gridx = 0;
       c.gridy = 1;
       gridbag.setConstraints(tagModeLbl, c);
       contentPane.add(tagModeLbl);
       tagTxt = new JTextField("plinth");
       c.gridx = 1;
       c.gridy = 0;
       c.gridwidth = 2;
       gridbag.setConstraints(tagTxt, c);
       contentPane.add(tagTxt);
       String[] options = {"all", "any"};
       modeCombo = new JComboBox(options);
       c.gridx = 1;
       c.gridy = 1;
       c.gridwidth = 1;
       gridbag.setConstraints(modeCombo, c);
       contentPane.add(modeCombo);
       searchBtn = new JButton("Search");
       c.gridx = 1;
       c.gridy = 2;
       gridbag.setConstraints(searchBtn, c);
       contentPane.add(searchBtn);
       resTable = new JTable(5,3);
       c.gridx = 0;
       c.gridy = 3;
       c.gridwidth = 3;
       gridbag.setConstraints(resTable, c);
       contentPane.add(resTable);
       previewLbl = new JLabel("Preview goes here");
       c.gridx = 0;
       c.gridy = 4;
       gridbag.setConstraints(previewLbl, c);
       contentPane.add(previewLbl);
      addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
         System.exit(0);
        }
      });
    }
     public static void main(String args[]) {
      GridBagWindow window = new GridBagWindow();
      window.setTitle("GridBagWindow");
      window.pack();
      window.setVisible(true);
     }
    }

    构造方法前的代码都不是很特殊,都是一些相当标准的import和变量定义。但是进入构造方法后,事情就变得有趣了。

    Container contentPane = getContentPane();

    GridBagLayout gridbag = new GridBagLayout();

    contentPane.setLayout(gridbag);

        我们以GridBagWindow的内容面板作为开始来创建一个GridBagLayout对象,准确地说,这个方法与过去我们所创建GridLayout对象和BorderLayout对象的方法是一样的。那么,现在我们就开始来设置GridBagLayout对象使它作为内容面板的布局。

    GridBagConstraints c = new GridBagConstraints();

        然后我要提到这整个进程中的一个独特的对象,那就是GridBagConstraints。这个对象在GridBagLayout中控制所有被安置在其中组件的约束。为了把一个组件增加到你的GridBagLayout中去,你首先必须将它与一个GridBagConstraints对象建立连接。

    GridBagConstraints可以从11个方面来进行控制和操纵,也可以给你提供一些帮助。这些内容是:

    • Gridx——组件的横向坐标
    • Girdy——组件的纵向坐标
    • Gridwidth——组件的横向宽度,也就是指组件占用的列数,这与HTML的colspan类似
    • Gridheight——组件的纵向长度,也就是指组件占用的行数,这与HTML的rowspan类似
    • Weightx——指行的权重,告诉布局管理器如何分配额外的水平空间
    • Weighty——指列的权重,告诉布局管理器如何分配额外的垂直空间
    • Anchor——告诉布局管理器组件在表格空间中的位置
    • Fill——如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充
    • Insets——指组件与表格空间四周边缘的空白区域的大小
    • Ipadx—— 组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值
    • ipady—— 组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值

        可能对于一个组件的每一个实例你都需要为它建立一个单独的GridBagConstraints;然而,这种方法我们并不推荐使用。最好的方法是,当你调用它的时候把对象设置为默认值,然后针对于每一个组件改变其相应的域。

        这个方法具有通用性,因为在一些域中,比如insets、padx、pady和fill这些域,对于每一个组件来说一般都是相同的,因此这样对一个域进行设置就会更轻松了,也能更轻松的在另外的组件中改变某些域的值。

        如果在改变了某些域值之后,你想回到原始的域值的话,你应该在增加下一个组件之前进行改变。这种方法使你更容易明白你正在修改的内容,也能使你更容易明白在一连串对象中的这11个参数的作用。

        也许你现在对这些内容还是一知半解,不过事实上一旦你理解了GridBagConstraints,值得安慰的是你以后做再困难的工作都会游刃有余了。

    所以,如果我们已经明白了GridBagConstraints的详细用法了,那么现在就让我们来看看在实际应用中应该如何来实现它:

    tagLbl = new JLabel("Tags");
    c.gridx = 0; //x grid position
    c.gridy = 0; //y grid position
    gridbag.setConstraints(tagLbl, c); //设置标签的限制

    contentPane.add(tagLbl); //增加到内容面板

    我们所做的是示例我们的标签、分配给它一个格位置,将它与一个约束对象联系起来并把它增加到我们的内容面板中。

    tagModeLbl = new JLabel("Tag Mode");
    c.gridx = 0;
    c.gridy = 1;
    gridbag.setConstraints(tagModeLbl, c);

    contentPane.add(tagModeLbl);

      请注意,虽然我们已经在我们的约束对象中把gridx的值设置为0,但是在这里我们仍然要对它进行重新设置——这样做没有其它原因,只是为了增加可读性。

        下面,我们增加一个文本域以便能存储我们希望能搜索到的关键字,再增加一个组合框以便用来搜索多个关键字。除了我们希望的文本域有两列之外,这个概念其他的方面都与上面所说的是相同的,所以,我们需要在增加组合框之前重新设置文本域的值。

    tagTxt = new JTextField("plinth");
    c.gridx = 1;
    c.gridy = 0;
    c.gridwidth = 2;
    gridbag.setConstraints(tagTxt, c);
    contentPane.add(tagTxt);

    String[] options = {"all", "any"};
    modeCombo = new JComboBox(options);
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    gridbag.setConstraints(modeCombo, c);
    contentPane.add(modeCombo);

          做了这些之后,我们再在内容面板中增加一些其余的简单组件,这时候我们就能够浏览它了;其余的代码应该不会出现任何问题了。

    到这个阶段,我们应该已经得到了一个类似于我们先前所设计的界面了.

     
  • 相关阅读:
    通用Excel导入工具V1.0使用说明
    RDIFramework.NET — 基于.NET的快速信息化系统开发框架 5.4平台日志、异常管理、生成自动升级配置文件模块
    .NET快速开发整合框架(RDIFramework.NET)【开发实例】之产品管理(WinForm)
    RDIFramework.NET ━ .NET快速信息化系统开发框架 4.11 角色权限管理模块
    RDIFramework.NET ━ .NET快速信息化系统开发框架 4.8 模块(菜单)管理
    RDIFramework.NET — 基于.NET的快速信息化系统开发框架 5.1 数据字典管理模块
    RDIFramework.NET ━ .NET快速信息化系统开发框架 4.10 用户权限管理模块
    RDIFramework.NET ━ .NET快速信息化系统开发框架 4.9 操作(功能)权限管理模块
    推荐+1置顶+1(分享、讨论、实现)通用软件注册功能之建立有效的软件保护机制
    RDIFramework.NET ━ .NET快速信息化系统开发框架4.7 组织机构管理模块
  • 原文地址:https://www.cnblogs.com/zhangyuefen/p/2640073.html
Copyright © 2011-2022 走看看