Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 364|回复: 0

[Swing学习]深入学习GridBagLayout

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-2 23:55:51 | 显示全部楼层 |阅读模式
    利用java来创建图形用户界面,最苦恼的事情莫过于选择用哪种布局管理器了。

          许多应用程序使用嵌套的Border和GridLayout来进行布局, 但是得到的结果要么变得太死板、太嵌套了以至于都无法工作了,要么就是窗口在变化的时候布局太不合理了,这样往往解决方法只有启用多个窗口,还有要么就是固定窗口的大小不允许改变。     无论是那种选择都不是很好,因为它使得应用程序从界面看上去不太美观,同样也会让应用程序的界面在使用上受到很多的限制。

         但还好有一个工具能够解决所有的这些问题―那就是GridBagLayout。可惜很多人因为看到这个布局管理器感觉它太复杂了认为很难而不敢去学习,他们一直都不愿意尝试下去使用这个布局管理器。  
      
       
       
         
       

         
       
      
          试着用用你会发现其实GridBagLayout真的能解决几乎所有界面布局的问题,窗口大小的随意改变也不会影响到整体布局,更重要的是它可以实现任何你想要的布局设计,只要你做到更有计划和更有耐心一点就行了。

    三思而后行      GridBagLayout 不是用于简单的示例程序界面。使用GridBagLayout搭建界面就像是在起居室中搭脚手架清除画钩一样。 对于简单的程序使用Boborderlayout和Gridlayout就绰绰有余了, 但如果要把程序提到实际应用上你就得考虑使用GridBagLayout。当然, 做复杂的应用程序时,一开始就使用GridBagLayout就会更有效率。 一旦你决定使用GridBagLayout,接下来一步便是要找一些纸和铅笔,只有你准确知道你的界面看上去需要成什么样子,你就可以敲键盘。这就是说,你应该在编码之前进行妥善规划。     下面将介绍一个很小的应用程序来帮助我们学习GridBagLayout,这个例子是从一个Flickr RSS fead中显示一系列照片, 最后的界面就像下面这样: 下面的是这个界面的一个原始草图: 正如你所看到的,最终的结果看上去和计划的想法完全一样。     你应该能看到在草图里有一些线,这些线是用来把总界面分成若干行和列的,这样你就很清楚每一个组件放置的格子位置。这就是GridBagLayout里"格"的那一部分,而图上的数字就是格的号码。 在某种意义上说, 我们可以把GridBagLayout想象成为早些年的HTML3和4,它们都是基于表的布局,Grid的概念就类似rowspan和colspan的意思,只不过换了个名字罢了。 随着我们的界面和表格的设置完成,是时候该进行界面布局并开始写代码了。 工作过程 这一节我假定你已经了解了基本的窗口和组件创建知识。 通过这篇文章我们最终能在一个frame中布局组件,我们将在以后的文章对界面进行改进使它更适用。因此,为了了解这整个工作的过程,我们列出了所有的目标代码。

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. public class GridBagWindow extends JFrame {
    5.   private JButton searchBtn;
    6.   private JComboBox modeCombo;
    7.   private JLabel tagLbl;
    8.   private JLabel tagModeLbl;
    9.   private JLabel previewLbl;
    10.   private JTable resTable;
    11.   private JTextField tagTxt;
    12. public GridBagWindow() {
    13.    Container contentPane = getContentPane();
    14.    GridBagLayout gridbag = new GridBagLayout();
    15.    contentPane.setLayout(gridbag);
    16.    GridBagConstraints c = new GridBagConstraints();
    17.    //setting a default constraint value
    18.    c.fill =GridBagConstraints.HORIZONTAL;
    19.    tagLbl = new JLabel("Tags");
    20.    c.gridx = 0; //x grid position
    21.    c.gridy = 0; //y grid position
    22.    gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object
    23.    contentPane.add(tagLbl); //add it to content pane
    24.    
    25.    tagModeLbl = new JLabel("Tag Mode");
    26.    c.gridx = 0;
    27.    c.gridy = 1;
    28.    gridbag.setConstraints(tagModeLbl, c);
    29.    contentPane.add(tagModeLbl);
    30.    tagTxt = new JTextField("plinth");
    31.    c.gridx = 1;
    32.    c.gridy = 0;
    33.    c.gridwidth = 2;
    34.    gridbag.setConstraints(tagTxt, c);
    35.    contentPane.add(tagTxt);
    36.    String[] options = {"all", "any"};
    37.    modeCombo = new JComboBox(options);
    38.    c.gridx = 1;
    39.    c.gridy = 1;
    40.    c.gridwidth = 1;
    41.    gridbag.setConstraints(modeCombo, c);
    42.    contentPane.add(modeCombo);
    43.    searchBtn = new JButton("Search");
    44.    c.gridx = 1;
    45.    c.gridy = 2;
    46.    gridbag.setConstraints(searchBtn, c);
    47.    contentPane.add(searchBtn);
    48.    resTable = new JTable(5,3);
    49.    c.gridx = 0;
    50.    c.gridy = 3;
    51.    c.gridwidth = 3;
    52.    gridbag.setConstraints(resTable, c);
    53.    contentPane.add(resTable);
    54.    previewLbl = new JLabel("Preview goes here");
    55.    c.gridx = 0;
    56.    c.gridy = 4;
    57.    gridbag.setConstraints(previewLbl, c);
    58.    contentPane.add(previewLbl);
    59.   addWindowListener(new WindowAdapter() {
    60.     public void windowClosing(WindowEvent e) {
    61.      System.exit(0);
    62.     }
    63.   });
    64. }
    65. public static void main(String args[]) {
    66.   GridBagWindow window = new GridBagWindow();
    67.   window.setTitle("GridBagWindow");
    68.   window.pack();
    69.   window.setVisible(true);
    70. }
    71. }
    复制代码
    构造方法前的代码都不是很特殊,都是一些相当标准的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);       做了这些之后,我们再在内容面板中增加一些其余的简单组件,这时候我们就能够浏览它了;其余的代码应该不会出现任何问题了。 到这个阶段,我们应该已经得到了一个类似于我们先前所设计的界面了。

    进一步学习      当然,界面不是智能的。重新设置窗口的大小,看看将会发生些什么事情。为什么它会那样呢?那是因为我们设置了约束对象的weightx、weighty和fill的值。 关于其他类似的一些内容我们将在后面的章节中进行介绍,但是如果你希望能自己试试的话,参考GridBigLayoutGridBagConstraintsAPI文档会对扩充你的知识提供很好的帮助。


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/2/235551093.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 16:17 , Processed in 0.343659 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表