内容简介:java的出现是编程艺术和计算环境改变的结果,是intenet发展的产物同时也是推动internet发展的动力。但是java作为新的编程语言,有许多不与以往编程语言不同的地方。布局管理就是其中的一个,本文的目的在于介绍如何将布局管理应用于现实工程中,而不是作为学习布局管理的参考资料。
布局管理对于众多编程人员来说是一个比较新的概念,因为以前使用的多种编程工具已经很好地解决了这个问题,根本就不用程序员自己考虑控件的布局问题,只需要简单的拖拽就可。但是接触到java之后,尤其是因为使用elipse等工具,就不得不认真地对待这个布局问题。而且我个人认为使用elipse这种工具开发也有它的长处,优点之一就是就是可以使开发者真正的在开发过程中思考每一个类的结构,可以使代码更加的优秀,同时也使一个程序员更容易向一个程序设计人员转变。
由于本文的目的在于介绍布局管理在现实工程中的应用,关于布局管理的基本内容,这里不再介绍,并把读者定位于已经基本了解布局管理的使用方法的程序员,没有掌握布局管理基础知识的读者可以参考sun提供的java api。
开始接触布局管理的程序员可能会感觉布局管理比较难于对付,增加了开发人员对商业逻辑考虑之外的负担,这个的确是事实,但是远不如刚接触不觉布局管理的人想象得那么难。因为从工程角度考虑的话,一个用户界面的并非十分的复杂,当然我是指的一般的数据库应用程序,界面极其复杂的工具类软件。一般来说数据库应用程序的主要应用在于对数据库的维护,回想我们以前从事过的工程,用户界面基本上由菜单,数据列表,数据编辑组件,一组用来提交用户工作的按钮组成。以下内容就以上述组件作为一个数据库应用程序的用户界面为基础展开讨论。
首先我们把这些窗体内容分组,然后把每一组组件放在一个容器中(这是我以往的开发过程中处理用户界面的方法,个人认为可以简化用户界面的开发),这样我们就把以上组件划分为两组(菜单不再布局考虑之内)即数据组件和按钮,然后我们在把数据组件分成数据列表,数据编辑组件分成两组,将以上个组分别放置在各自的容器中,使用程序表达出如下:
| jframe sampleframe = new jframe("sample frame for manager layout"); jpanel paneldatacontent = new jpanel(); // 数据组件容器 jpanel paneldatalist = new jpanel(); // 数据列表容器 jlist listdata = new jlist(); /* 注释1 这里应该是使用布局管理把listdata放在paneldatalist上 */ jpanel paneldataeditor = new jpanel(); // 数据编辑组件容器 jtextfield editdata1 = new jtextfield(); //...... // some other edit controls /* 注释2 这里应该是使用布局管理把数据编辑组件放在paneldataeditor上 */ /* 注释3 这里应该是使用布局管理器把paneldatalist和paneldataeditor放在 paneldatacontent上 */ jpanel panelbutton = new jpanel(); // 按钮容器 jbutton buttonmodify = new jbutton("modify"); //...... //some other buttons /* 注释4 这里应该是使用布局管理器把按钮放在panelbutton上 */ container c = sampleframe.getcontentpane(); /* 注释5 这里应该是使用布局管理器把panelbutton和paneldatacontent放在c上 */ |
这样的话,我们在开始考虑布局的时候就可以考虑把一个窗体分为两部分。这样我们就有两种结构可以选择,上下结构和左右结构。下面我们来先考虑上下结构。
以我个人的审美观点和便利性角度的考虑,我会选择把panelbutton放在下面,同时我们应该考虑到paneldatacontent应该占据除了panelbutton之外所有sampleframe空间,就像是在使用delphi是我们将一个tpanel的实例的align设置成alclient。这样borderlayout就成为c的布局管理器。因为在borderlayout中,如果使用borderlayout.
center的方式则达到这种目的。那么panelbutton则应该使用borderlayout.sourth的方式布局。于是产生了一下代码
| c.setlayout(new borderlayout());//这一句可以省略,因为frame的默认布局是 borderlayout。 c.add(paneldatacontent,borderlayout.center); c.add(panelbutton,borderlayout.south); |
我们只需把以上的代码代替注释5,就实现了第一次分组的布局。接着我们是用同样的布局管理来实现第二次分组,也就是数据组件的分组。
| paneldatacontent.setlayout(new borderlayout());//不可省略,jpanel的默认布局是 flawlayout。 paneldatacontent.add(paneldatalist,borderlayout.center); paneldatacontent.add(paneldataeditor,borderlayout.south); |
将以上代码代替注释3的位置即可。
下面我们来分别处理三个jpanel(paneldatalist,paneldataeditor,panelbutton)上的控件的布局。
在处理这个问题之前我也揭示(不是解释)一点java布局管理对空间大小的影响,这里我不用“解释”的原因在于我只是了解到这一点,而没有深入的研究原理何在。flowlayout保持由他管理的容器上的控件的大小(应该是preferred size),gridlayout从来不理会这些空间的大小,只是把控件完全填充由gridlayout划分的格子但是我们应该注意到gridlayout讲一个容器划分成等面积大小的格子,一次不适合我们以上的应用)。而borderlayout对空间的控制介于以上两者之间。borderlayout使放在north和sourth的控件保持合适的高度,是放置在east和west的控件保持合适的宽度,使放在center的控件占据剩余的所有空间。
这样一来对于datalist的放置我们有两种一种是使用borderlayout布局管理,把datalist放在borderlayout.center的位置,一种是使用gridlayout把paneldatalist划分一个格子。事实也是如此。开发者可以根据自己的喜好从这两种布局中选出一种。
| //paneldatalist.setlayout(new borderlayout()); //paneldatalist.add(listdata,borderlayout.center); paneldatalist.setlayout(new gridlayout(1,1)); paneldatalist.add(listdata); |
至于panelbutton的布局格式因该选择flowlayout,也许有的读者会提出为什么不选择gridlayout,因为如果使用这种布局方法,地区可以保证按钮全部在一排,但是当用户改变窗体大小时,会出现按钮过长或过短的情形。但是使用flowlayout的缺点在于用户使宽度小于按钮的宽度和时,会使一些按钮不可见。
| panelbutton.setlayout(new flowlayout());//可以省略。因为flowlayout时jpanel的 |
默认布局方式
| panelbutton.add(buttonnew); |
对于paneldataeditor的布局管理,需要根据不同的情况来进行判断处理,而我认为最佳的选择时gridbaglayout。当然如果排放的空间相当简单,使用gridbaglayout反而体现不出它的优越性。由于这一部分的随机性,这里不再介绍。一下使我在写这样文章时的全部代码,提供给大家以供参考。
/* * created on 2003-7-14 */ import javax.swing.*; import java.awt.*; /** * @author idilent * supporting the paper which name is "java布局管理器在现实工程中的应用" */ public class layoutsample { public static void main(string[] args) { jframe sampleframe = new jframe("sample frame for manager layout"); jpanel paneldatacontent = new jpanel(); // 数据组件容器 jpanel paneldatalist = new jpanel(); // 数据列表容器 jlist listdata = new jlist(); //这里可以使用两种方案 //paneldatalist.setlayout(new borderlayout()); //paneldatalist.add(listdata,borderlayout.center); paneldatalist.setlayout(new gridlayout(1,1)); paneldatalist.add(listdata); /* 注释1 这里应该是使用布局管理把listdata放在paneldatalist上 */ jpanel paneldataeditor = new jpanel(); // 数据编辑组件容器 jtextfield editdata1 = new jtextfield(20); paneldataeditor.add(editdata1); // ...... // some other edit controls /* 注释2 这里应该是使用布局管理把数据编辑组件放在paneldataeditor 上 */ /* 注释3 这里应该是使用布局管理器把paneldatalist和 paneldataeditor放在 paneldatacontent上 */ paneldatacontent.setlayout(new borderlayout());//不可省略, jpanel的默认布局是flawlayout。 paneldatacontent.add(paneldatalist,borderlayout.center); paneldatacontent.add(paneldataeditor,borderlayout.south); jpanel panelbutton = new jpanel(); // 按钮容器 jbutton buttonnew = new jbutton("new"); jbutton buttonmodify = new jbutton("modify"); jbutton buttondelete = new jbutton("delete"); jbutton buttonsave = new jbutton("save"); // ...... //some other buttons /* 注释4 这里应该是使用布局管理器把按钮放在panelbutton上 */ panelbutton.add(buttonnew); panelbutton.add(buttonmodify); panelbutton.add(buttondelete); panelbutton.add(buttonsave); container c = sampleframe.getcontentpane(); /* 注释5 这里应该是使用布局管理器把panelbutton和paneldatacontent 放在c上 */ c.setlayout(new borderlayout()); //这一句可以省略,因为frame的默认布局是borderlayout。 c.add(paneldatacontent,borderlayout.center); c.add(panelbutton,borderlayout.south); sampleframe.setsize(300,300);//不使用pack()的原因是,使jlist 显示 sampleframe.show(); } } |
闽公网安备 35060202000074号