java 布局管理器

在开发Java Swing应用程序时,最经常的是,我们需要在多个嵌套面板中使用多个布局管理器。 这通常不是问题,被认为是几乎所有人类已知语言的所有UI开发的常规做法。

但是,大多数情况下,对于UI中的每个面板,只需要一个布局管理器即可达到所需的效果,但是有时您需要根据容器中的组件数对同一容器使用多个布局管理器。

这样的示例之一是在创建“居中网格”布局时。 大多数情况下,如果组件的数量固定,则GridLayout或GridBagLayout可能就足够了,但是如果组件的数量不断变化,则布局可能不理想。 今天下午我遇到了类似的问题,这是我想出的解决方案。

我想要实现的UI与Opera的快速拨号类似,但是拨号次数可变。 基本上,

  1. 您从一个组件开始,应该在面板中居中
  2. 添加另一个组件,它们都应该居中
  3. 添加三分之一,所有三个都应放在一行的中心
  4. 如果添加了第四个组件,则您应该有一个3 x 2的矩阵,第一行中有三项,第二行中有一项
  5. 3个x 2矩阵应最多保留六个组件
  6. 对于6个以上的组件,矩阵应为4 x 3,因此我们最多可以容纳12个组件,这将是最大

最初,此要求看起来很棘手,但解决方案通常是仅使用两个JPanels的布局管理器的组合。 基本上,是一个用于使内部内容物居中的外部容器,以及一个用于根据需要创建矩阵的内部容器。

使用哪个布局管理器

随之而来的问题是,哪个布局管理器可以提供所需的结果? 经过几分钟的试验,我终于意识到GridBagLayout给了我所需的居中内容外观,但是有时是不一致的。 因此,我选择通过netbeans设计器使用GroupLayout。 因此,将其应用于外部容器。

接下来,我试图找到一个可以有效满足第一个要求的布局管理器。 选项为FlowLayout和GridLayout。 但是,尽管FlowLayout倾向于将其内容垂直对齐到顶部,但在这种情况下就足够了,因为GroupLayout将FlowLayout内容垂直居中,并满足了1-3的要求。

接下来,对于需求4,再次选择了GridLayout,但是这次将其设置为anx 3矩阵,其中n是任意数量的行。 这使GridLayout可以按预期增长,并且还可以在垂直放置之前先水平放置其组件。 这也自动满足了要求5。

最后,当组件大于6时,将创建一个新的GridLayout,其大小为nx 4,有效地排列内容。 可以进一步添加新组件,直到最多达到12个组件为止,并且禁止进一步添加。

这是该过程的示例代码。

JPanel container = new JPanel();
container.setName("container"); // NOI18N
container.setOpaque(false);JPanel content = new JPanel();
content.setBorder(javax.swing.BorderFactory.createEmptyBorder(50, 50, 50, 50));
content.setName("content"); // NOI18N
content.setOpaque(false);
content.setLayout(new java.awt.GridLayout(0, 3));javax.swing.GroupLayout containerLayout = new javax.swing.GroupLayout(container);
container.setLayout(containerLayout);
containerLayout.setHorizontalGroup(containerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(containerLayout.createSequentialGroup().addContainerGap(346, Short.MAX_VALUE).addComponent(content, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(347, Short.MAX_VALUE))
);
containerLayout.setVerticalGroup(containerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(containerLayout.createSequentialGroup().addContainerGap(223, Short.MAX_VALUE).addComponent(content, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(224, Short.MAX_VALUE))
);

然后,每添加一个新组件,就会运行以下代码:

getContent().removeAll();int gridSize = organisations.size();switch( gridSize ) {case 1:case 2:case 3:getContent().setLayout( new FlowLayout(FlowLayout.CENTER) );break;case 4:case 5:case 6:getContent().setLayout( new GridLayout(0,3) );break;case 7:case 8:getContent().setLayout( new GridLayout(0,4) );break;default:getContent().setLayout( new GridLayout(0, 4) );
}for (Organisation org : organisations) {getContent().add(createOrgSelectionComponent(org));
}getContent().validate();
getContent().repaint();

这是最终布局的屏幕截图。

参考: 有时在Java中,我们的JCG合作伙伴 Francis在“ Ice in Code”博客中 还没有一个Layout Manager 。

相关文章 :
  • JavaFX 2.0 beta示例应用程序和思考
  • Xuggler开发教程
  • Java Swing –日期选择器对话框
  • SmartGWT入门,提供出色的GWT界面
  • YouTube Java API入门

翻译自: https://www.javacodegeeks.com/2011/09/sometimes-in-java-one-layout-manager-is.html

java 布局管理器

java 布局管理器_有时在Java中,一个布局管理器是不够的相关推荐

  1. python进入上下文管理器_浅谈Python中with(上下文管理器)的用法

    例子一 首先来看一段代码: classFoo(object):def __init__(self):print('实例化一个对象')def __enter__(self):print('进入')def ...

  2. webgl 着色器_如何在WebAssembly中使用WebGL着色器

    webgl 着色器 by Dan Ruta 通过Dan Ruta 在WebAssembly中使用WebGL着色器 (Using WebGL shaders in WebAssembly) WebAss ...

  3. 北大青鸟java第一单元项目_北大青鸟java第一单元项目迷你TXT小说阅读器

    [实例简介] 自用 已通过老师检测 得分88分 北大青鸟java第一单元项目迷你TXT小说阅读器,可以作为java se学习项目也可以作为其他项目,项目完整可直接运行 [实例截图] [核心代码] TX ...

  4. java 内部类 加载_举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...

  5. java的双亲委派_深入理解Java的类加载器及双亲委派机制

    当我们在写完一个Java文件的时候,编译器会将.java文件编译成.class文件,然后当程序运行时,JVM首先会找到main方法所在类,并将main所在类的class文件字节码读到内存中,转换成JV ...

  6. java微信群自动回复_微信群运营必备的社群管理工具,让你实现月入过万-工具...

    社群运营中需要用到哪些工具呢?都说工欲善其事必先利其器,互联网时代无论做哪一项工作如果能借助工具效率就能有效提高.如果管理微信多个社群进行运营,每天维护广告就要花去很多花去很多时间哪还能进行其他工作的 ...

  7. java 对象排重_现代化的 Java (八)——重说对象序列化

    事故 昨晚上准备把 sequences 服务扔到我的旧笔记本上然后写下单系统,然后发现一个很囧的事情-- 消息序列化竟然失败了. 翻过去的代码,逐个排除问题,基本上结论是:因为过去我的测试写的太简单, ...

  8. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  9. java教程哪里好_最好的Java教程是什么?

    什么是Java最好的教程? 能够带你入门的叫做好教程?是的,不管教程一什么样的方式去上课,我觉得能够带我顺利入门的教程就是一个很好的教程 其实每个人的意见都不一样,有的会觉得看着开心的才是好教程,有的 ...

最新文章

  1. Android学习笔记进阶十一图片动画播放(AnimationDrawable)
  2. 微软职位内部推荐-Principal Dev Manager
  3. Java日志框架-Logback手册中文版以及官方配置文档教程
  4. android手机数字取证,基于Android智能终端微信应用的数字取证分析模型的研究
  5. 如何检查Go中是否存在文件?
  6. 光纤激光切机计算机无法启动,激光切割机不出光,如何解决?
  7. android中几种定位方式详解
  8. comsol稀物质传递_COMSOL电弧仿真
  9. 管理mysql表知识点,数据库知识点整理(全)
  10. python之range与xrange使用区别
  11. 一个H264流,保存成多个文件需要注意的两个问题
  12. linux 启动 pycharm程序的命令(pycharm已安装好)
  13. Android破解学习之路(十五)—— 【Unity3D】洛菲斯的呼唤(Lophis roguelike)无限金币(道具)的实现 破解
  14. c# 图像识别 车辆型号【百度AI】
  15. 体检管理软件#一站式体检管理系统#体检管理软件#体检软件#体检系统#体检管理系统源码
  16. 【Love2d从青铜到王者】第一篇:Love2d入门以及安装教程
  17. 计算机应用团队,【计算机应用论文】团队合作学习下计算机应用论文(共3025字)...
  18. java.io.IOException: There appears to be a gap in the edit log. We expected txid ***, but got txid
  19. python实现猫抓老鼠
  20. php怎么访问ldap,用Php如何操作LDAP_PHP

热门文章

  1. 2015蓝桥杯省赛---java---C---3(无穷分数)
  2. 2019蓝桥杯省赛---java---B---6(特别数的和)
  3. 2019蓝桥杯省赛---java---B---4(数的分解)
  4. 2019蓝桥杯省赛---java---B---1(组队)
  5. 多环境切换---SpringBoot
  6. Mybatis使用IN语句查询
  7. linux u32,如何在程序中使用u32这个类型啊。
  8. centos普通用户修改文件权限_用户管理(特殊权限、特殊属性、umask 默认权限 )
  9. python isodd奇偶_Python这些位运算的妙用,绝对让你大开眼界
  10. throwable_您想了解的所有Throwable