利用Java来创建图形用户界面,最苦恼的事情莫过于选择用哪种布局管理器了。
许多应用程序使用嵌套的Border和GridLayout来进行布局, 但是得到的结果要么变得太死板、太嵌套了以至于都无法工作了,要么就是窗口在变化的时候布局太不合理了,这样往往解决方法只有启用多个窗口,还有要么就是固定窗口的大小不允许改变。
无论是那种选择都不是很好,因为它使得应用程序从界面看上去不太美观,同样也会让应用程序的界面在使用上受到很多的限制。
但还好有一个工具能够解决所有的这些问题—那就是GridBagLayout。可惜很多人因为看到这个布局管理器感觉它太复杂了认为很难而不敢去学习,他们一直都不愿意尝试下去使用这个布局管理器。
试着用用你会发现其实GridBagLayout真的能解决几乎所有界面布局的问题,窗口大小的随意改变也不会影响到整体布局,更重要的是它可以实现任何你想要的布局设计,只要你做到更有计划些和更有耐心一点就行了。
三思而后行
GridBagLayout 不是用于简单的示例程序界面。使用GridBagLayout搭建界面就像是在起居室中搭脚手架清除画钩一样。
对于简单的程序使用Boborderlayout和Gridlayout就绰绰有余了, 但如果要把程序提到实际应用上你就得考虑使用GridBagLayout。当然, 做复杂的应用程序时,一开始就使用GridBagLayout就会更有效率。
一旦你决定使用GridBagLayout,接下来一步便是要找一些纸和铅笔,只有你准确知道你的界面看上去需要成什么样子,你就可以敲键盘。这就是说,你应该在编码之前进行妥善规划。
下面将介绍一个很小的应用程序来帮助我们学习GridBagLayout,这个例子是从一个Flickr RSS fead中显示一系列照片, 最后的界面就像下面这样:
下面的是这个界面的一个原始草图:
正如你所看到的,最终的结果看上去和计划的想法完全一样。
你应该能看到在草图里有一些线,这些线是用来把总界面分成若干行和列的,这样你就很清楚每一个组件放置的格子位置。这就是GridBagLayout里"格"的那一部分,而图上的数字就是格的号码。
在某种意义上说, 我们可以把GridBagLayout想象成为早些年的HTML3和4,它们都是基于表的布局,Grid的概念就类似rowspan和colspan的意思,只不过换了个名字罢了。
随着我们的界面和表格的设置完成,是时候该进行界面布局并开始写代码了。
工作过程
这一节我假定你已经了解了基本的窗口和组件创建知识。
通过这篇文章我们最终能在一个frame中布局组件,我们将在以后的文章对界面进行改进使它更适用。因此,为了了解这整个工作的过程,我们列出了所有的目标代码。
import java.awt.*; import java.awt.event.*; import javax.swing.*; 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);
做了这些之后,我们再在内容面板中增加一些其余的简单组件,这时候我们就能够浏览它了;其余的代码应该不会出现任何问题了。
到这个阶段,我们应该已经得到了一个类似于我们先前所设计的界面了。
进一步学习
当然,界面不是智能的。重新设置窗口的大小,看看将会发生些什么事情。为什么它会那样呢?那是因为我们设置了约束对象的weightx、weighty和fill的值。
关于其他类似的一些内容我们将在后面的章节中进行介绍,但是如果你希望能自己试试的话,参考GridBigLayout和GridBagConstraintsAPI文档会对扩充你的知识提供很好的帮助。
原文地址: http://blog.csdn.net/l12345678/article/details/1784864
相关推荐
**深入学习JFC Swing 教材详解** JFC(Java Foundation Classes)是Java平台上的一组图形用户界面(GUI)开发工具包,它包含了Swing组件库。Swing是Java提供的一种轻量级的GUI框架,它使用纯Java编写,可以在任何...
在深入学习Java Swing的过程中,我们通常会经历初级、中级、高级以及特效这四个阶段的学习。 **初级篇:基础组件与布局管理** 在初级阶段,我们需要掌握Swing的基础组件,如JButton、JLabel、JTextField、JTextArea...
在深入学习JFC Swing时,我们主要会接触到以下几个关键知识点: 1. **组件(Components)**:Swing 提供了多种组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、面板(JPanel)、滚动窗格...
《深入学习JFC.SWING—JAVA基础类组件集》是一部专为Java开发者设计的深度教程,主要聚焦于Java Foundation Classes (JFC)中的Swing组件库。Swing是Java GUI编程的重要工具,它提供了丰富的用户界面元素,使得开发者...
Satyaraj Pantham所著的《深入学习:JFC Swing-Java基础类组件集》是一本专注于Swing框架的权威指南,该书不仅详尽介绍了Swing的使用方法、技巧和编程注意事项,同时也适用于中高层编程人员。本书的翻译者是黄晓鸣和...
通过深入学习和实践"精通Java Swing程序设计"中的内容,你不仅可以掌握Swing的基本用法,还能了解如何设计和实现复杂的GUI应用,从而提升你的Java桌面应用开发技能。该书的.chm文件可能包含了详细的章节、示例代码和...
在Android平台上,开发一个简单的计算器应用是一个常见的编程练习,它能帮助初学者理解Java语言以及Android SDK的...在不断优化和完善的过程中,可以学习到更多的高级特性,如自定义视图、保存用户状态、动画效果等。
通过Swing进阶.ppt和Scoket编程.ppt,你可以深入学习Swing组件的高级用法以及Socket编程的实战技巧,这对于提升Java开发技能非常有帮助。 总之,Socket和Swing是Java程序员必须掌握的技术,它们分别对应了网络编程...
总的来说,《Java小程序技能百练》是一份全方位的教程,覆盖了从基础到高级的Java小程序开发技能,对于希望在Java GUI编程领域深入学习的开发者来说,是一份宝贵的参考资料。通过系统的练习和理论学习,学习者能够...
通过本套Java课件的学习,你将能够系统地掌握Java编程的基础知识,为后续深入学习Java EE、Android开发或其他Java相关技术打下坚实基础。记得理论结合实践,动手编写代码,才能更好地巩固知识。
【Java学习笔记全程详解】 Java作为一种广泛应用于企业级开发、移动应用、大数据处理等领域的编程语言,其学习过程涵盖了许多核心概念和技术。...通过深入学习和实践,可以有效提升Java编程技能。
【标题】:Java面试题 在Java面试中,掌握核心概念和实践经验至关重要。这份压缩包包含了一系列关于Java语言的关键知识点,旨在帮助准备面试者提升自己的技术...通过深入学习和实践,将有助于在Java面试中脱颖而出。
在Java编程领域,界面设计是不可或缺的一部分,尤其对于开发用户友好型的应用程序至关重要。"Java界面编程-中级界面篇"涵盖了...通过深入学习并实践提供的代码示例,开发者将能够构建出更加美观、易用的Java GUI应用。
本资源主要包含了一系列与Java Swing相关的学习代码示例,涵盖了许多基本和高级特性。 1. **计算器**:在Swing中,可以使用JTextField作为输入字段,配合ActionListener监听按键事件,实现计算功能。通过...
Java 2 图形设计卷II专注于Swing框架,它是Java平台上的一个核心组件,用于构建图形用户界面(GUI)。Swing提供了丰富的组件库,...通过深入学习和实践,开发者可以利用Swing创建出功能强大、用户友好的桌面应用程序。
Java是一种广泛使用的面向对象...总的来说,这两个示例项目提供了一个很好的实践平台,让你能够深入理解和应用Java Swing的事件处理和布局管理。通过实际操作,你可以更好地掌握这些核心概念,并且提升自己的编程技巧。
通过深入学习,你将能够熟练掌握Swing组件的使用,理解布局管理,编写响应用户操作的事件处理代码,以及利用Swing提供的高级功能来提升用户体验。无论是开发桌面应用还是进行GUI编程的学习,这个教程都将为你打下...
在这个"java swing 学习资料"中,我们可以通过提供的源码来深入理解Swing的基本用法和实践技巧。 Swing 包含了各种组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、面板(JPanel)、滚动窗格(JScrollPane)...
在"JAVA GUI实例课件"中,你将深入学习如何利用Java进行GUI的设计和实现。 GUI基础讲解可能涵盖了以下几个核心概念: 1. **组件(Components)**:GUI的基本构建块,如按钮(JButton)、文本框(JTextField)、...
在本培训中,你将深入学习Swing组件、布局管理、事件处理以及高级特性。 Swing提供了许多预定义的组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)等,这些组件可以用来构建用户交互的界面。通过...