分享
 
 
 

java布局管理器在现实工程中的应用

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

内容简介: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)[1],GridLayout从来不理会这些空间的大小,只是把控件完全填充由GridLayout划分的格子[2]但是我们应该注意到GridLayout讲一个容器划分成等面积大小的格子,一次不适合我们以上的应用)。而BorderLayout对空间的控制介于以上两者之间[3]。BorderLayout使放在NORTH和SOURTH的控件保持合适的高度,是放置在EAST和WEST的控件保持合适的宽度,使放在CENTER的控件占据剩余的所有空间[4]。

这样一来对于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();

}

}

[1]The Flow layout manager always honors a component's preferred size.The Grid layout manager never doese.The Border Layout manager does something in between.

[2]The layout manager honors the preferred heitht of the North and Sourth components and forces them to be exactly as wide ad the container.The East and West regions are almost the opposite of North and South.Center is simply the area that is left over after space has been given to the other regions.

[1][2]Complete Java™2 Certification Study Guide

版权所有:idilent 网站转载请注明作者 其他转载方式请与作者联系(idilent@yahoo.com.cn)。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有