在java swing 布局中,Panel必须放在一个布局中,这个Panel中可以放另一个布局吗

java布局管理器在现实工程中的应用 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&java布局管理器在现实工程中的应用&&&  内容简介: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   */  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 网站转载请注明作者 其他转载方式请与作者联系()。&&&&&今日推荐
&&&&&老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修... under pass
自由人非常擅长传球和垫球。
The libero is very go...·&·&·&&&&&&内容简介: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
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
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.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 网站转载请注明作者 其他转载方式请与作者联系([url=mailto:.cn].cn[/url])。&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&------解决方案--------------------在userList.java&里提供声明一个方法用来调用show
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 java swing 布局 的文章

 

随机推荐