有时在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VM克隆之后启动eth0找不到eth0:unknown interface:no such device

问题出现:VMware 克隆之后,ifconfig命令执行找不到eth0,报错 eth0:unknown interface:no such device 是因为/etc/sysconf/network-scripts/ifcfg-eth0配置复制过来和虚拟主机的网卡Mac等信息不匹配 解决方法; 删除/etc/udev/rules.d/70-pers…

“精彩极了”和“糟糕透了”

虽然已经是25岁,但是对小学的一篇课文依然记忆尤新,《“精彩极了”和“糟糕透了”》。 课文正文 记得七八岁的时候,我写了第一首诗。母亲一念完那首诗,眼睛亮亮的,兴奋地嚷着:“巴迪,真是你写的…

python中print的用法_Python中print函数简单使用总结

Python中print函数简单使用总结 print函数是Python的入门,每一个学习python的人都绕不开这个函数,下面介绍一下这个函数的用法。 打开电脑,选择python软件,下面选择python 3.7为例进行介绍,点击python 3.7,…

STM32F1笔记(十)PWM

PWM:Pulse Width Modulation,脉冲宽度调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说就是对脉冲宽度的控制。 在《STM32中文参考手册》里可以看到 占空比:占空比是指在一个脉冲循环内,通电时…

从GlassFish 3.x扩展到WebLogic 12c Server

Oracle针对GlassFish服务器的策略的主要目标之一是“与Fusion Middleware and Products集成”(来源: Community Roadmap,2010年5月 )。 在今年早些时候,您听到了很多关于两台服务器合而为一的恐惧和谣言。 看到这两种产…

移动互联网时代:如何让女孩爱上你在一分钟内?

部分《移动互联网时代:让女孩爱上你在一分钟内》其实我只是做原来的盲目思想有移动互联网的自主知识产权,他没有详细说明如何真正让女孩爱上你在一分钟内?在真实生活中,预期也没有那么简单,易于,毕竟&#…

hashset去重原理_基于simhash的文本去重原理

互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好。业界关于文本指纹去重的算法众多,如 k-shingle 算法、google 提出的simhash …

解决express video 手机无法播放的问题

http://stackoverflow.com/questions/24976123/streaming-a-video-file-to-an-html5-video-player-with-node-js-so-that-the-video-c 项目地址 https://github.com/shenggen1987/mp4-demo express index.jade extends layoutblock contenth1 titlep Welcome to #{title}vid…

STM32F1笔记(十一)ADC

查看《STM32中文参考手册》里ADC的介绍和特性 STM32的ADC最大转换速率为1Mhz,即1us,在ADCCLK14M,采样周期为1.5个ADC时钟下得到。当ADC的时钟超过14M时,将导致结果准确度下降。 规则通道相当于正常运行的程序。注入通道就相当于中…

使用JPA和Spring 3.1进行事务配置

1.概述 本教程将讨论配置Spring Transactions ,使用Transactional批注和常见陷阱的正确方法 。 要更深入地讨论核心持久性配置,请查看Spring with JPA教程 。 有两种不同的配置事务的方法– 批注和AOP –每种都有自己的优势–我们将在这里讨论更常见的…

java epoll select_字节跳动高频面试题,操作系统/算法/Java等。

字节跳动# Java▲ 20 Java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?▲ 18 synchronized 关键字底层是如何实现的?它与 Lock 相比优缺点分别是什么?▲ 17 hashmap 和 hashtable 的区别是什么?▲…

Xamarin Android项目运行失败

Xamarin Android项目运行失败 错误信息:Build Failed: MonoDroid does not support running the previous version. Please ensure your solution builds before running or debugging it.这是由于由于项目生成失败,并找不到以前编译的结果。这时&#…

STM32F1笔记(十二)DAC

先看《STM32中文参考手册》中DAC的介绍 引脚的定义与ADC类似 这里需要留意手册提供的注意,DAC应该是输出,但是GPIO初始化配置时却要设置为模拟输入。 DAC配置示例 void DAC_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_Init…

有关为旧版代码创建存根的更多信息–测试技术7

在上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根。 但是,如果由于旧类的源代码已被锁定在第三方JAR文件中而无法访问它,会发生什么情…

python动态时钟代码_python绘制动态时钟

桌面时钟项目描述 1、使用turtle库绘制时钟外形及表针; 2、使用datetime获取系统时间; 3、时钟动态显示 turtle库基本命令 1、turtle.setup()函数:用于启动一个图形窗口,它有四个参数turtle.setup(width, height, startx, starty)…

Ajax 学习 - 基础学习

《AJax - Async Javascript and xml - 异步的JavaScript和XML》 一、基础认识 AJax技术的目的:实现页面无刷新数据动态更改 优点: 不需要插件支持 提供WEB程序的功能 优秀的用户体验 减轻服务器带宽的负担 缺点: 破坏浏览器的前进与后退 搜索引擎…

STM32F1笔记(十三)SPI

SPI:Serial Peripheral interface,串行外围设备接口。 SPI接口一般使用4条线通信: MISO主设备数据输入,从设备数据输出。 MOSI主设备数据输出,从设备数据输入。 SCLK时钟信号,由主设备产生。 从图中可以…

红帽Openshift:入门–云中的Java EE6

现在有一段时间,我正在研究“云”。 研究它的功能,它可以做什么,为什么我们应该切换到“云”,进行讨论,与RealDolmen的云专家maartenballiauw等人交谈。 我已经在Google App Engine(用于Java)上…

python自定义函数参数_python自定义函数的参数之四种表现形式

(1)def a(x,y):print x,y 这是最常见的定义方式,调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错 (2)def a(x,y3):print x,y 提供了默认值…

osg添加纹理示例

转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <osgViewer/Viewer> #include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/Texture2D&g…