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

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 布局管理器

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

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

相关文章

支付宝支付、微信支付(最详细教程)

对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。 第一步&#xff1…

降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算

本次采用中国土壤流失方程CSLE计算土壤侵蚀模数,计算公式为:ARKLSBET式中,式中:A—土壤侵蚀模数。thm-2a-1;R—降雨侵蚀力因子,MJmmhm-2h-1a-1;K—土壤可蚀性因子,thm2hhm-2MJmm-1&a…

购买阿里云ECS服务器忘记终端管理密码或者没有设置

自己开发一个APP,想把源码放到服务器上跑一跑,发现使用Xshell远程连接不上去,我记得买服务器的时候没有设置。 一般有两种方法: 1.买服务器的时候,阿里会给你发一份邮件,邮件里面有,这个是官方的说法,我是公司CTO,账号是老板开的,根本不可能看到邮件,所以对我来说不…

输出空格隔开换行_【前端干货】CSS 的空格处理

一空格规则HTML 代码的空格通常会被浏览器忽略。<p>◡◡hello◡◡world◡◡</p>上面是一行 HTML 代码&#xff0c;文字的前部、内部和后部各有两个空格。为了便于识别&#xff0c;这里使用半圆形符号◡表示空格。浏览器的输出结果如下。hello world可以看到&#x…

宝塔面板绑定域名导致无法访问

用这个命令rm -f /www/server/panel/data/domain.conf删除绑定域名后&#xff0c; 就能用ip端口进入面板了&#xff0c;以后还是不要绑定域名了 主要是因为我手残。 看重点&#xff0c;我是绑定了域名&#xff0c;用域名也无法访问。 现在终于进去啦

宝塔访问域名访问不到

首先说明一点&#xff0c;我这个问题不是宝塔面板绑定域名的那种情况。 浏览器输入域名会报上面的错误&#xff0c;经过各种尝试&#xff0c;发现是安全组没有放开&#xff0c;在阿里云控制台添加一个80/80的通用安全组规则即可&#xff0c;知道上行和下行的区别&#xff0c;打…

双千兆和双频千兆哪个好_关于千兆路由器的那些事儿!赶紧收藏

无线Wi-Fi已成为现代人生活、工作的标配&#xff0c;随着百兆乃至千兆的光纤网络普及&#xff0c;传统路由器已跟不上时代的速度了。不少用户的眼光已投向速度更快的千兆路由器&#xff0c;那么大家真的了解什么是千兆路由器吗&#xff1f;千兆路由器有哪几种&#xff1f;近期火…

华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验

1.1.1 关于本实验本实验通过配置BFD与BGP协议联动及与VRRP协议联动&#xff0c;掌握BFD的功能和配置方法。1.1.2 实验目的理解BFD的工作原理。 掌握BFD与BGP联动的应用场景及配置方法。 掌握BFD与VRRP联动的应用场景及配置方法。1.1.3 实验组网介绍图1-1 BFD原理配置实验拓扑图…

大学生助学贷款如何还利息(本金+利息都可以)

生源地助学贷款还利息的步骤: 1、首先需要将钱转入支付宝,金额稍微高于应还款项即可。然后登陆电脑版支付宝,一定是要电脑登陆(手机上无法操作),如图所示 2、然后在支付宝主页中,点击右上角的“应用中心”,然后点击“生活服务”如图所示。

谷歌浏览器下载的内容老是自动打开

原因是每次下载内容在浏览器左下角都有提示&#xff0c;一般都是选择打开所在文件夹&#xff0c;一次手残&#xff0c;点了总是打开此文件导致一下载文件就自动打开。 解决方法。 1.点击右上角的... 2.找到设置-高级设置-下载 3.关掉我标红的位置信息即可。现在看不到啦&…

JBoss Fuse 6.2发布–指导如何快速尝试

在上周的红帽峰会上&#xff0c;宣布发布了JBoss Fuse 6.2 。 我要祝贺保险丝团队发布此版本。 我知道他们今年以来一直非常努力地进行质量检查&#xff0c;并确保质量检查通过了企业产品所期望的高品质壁垒。 因此&#xff0c;带着我的Camel帽子&#xff0c;很高兴看到包含最…

插入文件找不到桌面了?

解决方法&#xff0c;在那个界面空白处&#xff0c;右键显示所有文件即可。

mysql自增长主键_MySQL数据库8(九)列属性之主键、自增长

主键顾名思义&#xff0c;主要的键&#xff0c;primary key&#xff0c;在一张表中&#xff0c;有且只有一个字段&#xff0c;里面的值具有唯一性创建主键随表创建系统提供了两种增加主键的方式&#xff1a;1、直接在需要当做主键的字段之后&#xff0c;增加primary key属性来确…

初学者如何学编程呢

先简单做个测试,这样就能找出你比较适合哪种语言。 下面简单介绍一下不同的语言吧

CellSet 遍历

CellSet 结构&#xff1a; 查询MDX&#xff1a; SELECT NON EMPTY {{ {{ {{ {{ {{ AddCalculatedMembers([店铺.店铺ID].[店铺ID].Members)}} }} }} }} }} DIMENSION PROPERTIES MEMBER_TYPE , [店铺.店铺ID].[店铺ID].[国家], [店铺.店铺ID].[店铺ID].[区域], [店铺.…

如何找到微信公众号的视频链接及视频?

我们经常在微信公众号中看到一些视频,那么有时候看到比较好的我们都希望能把这个视频下载下来,长久保存! 那么,如何找到视频的原链接并下载成为自己的视频呢?我给大家简单总结一下吧。 首先要明白微信公众号的视频来源只会出现在腾讯视频和微视两个平台。 ​以这个公众号…

GetWeApp聊天室 代码(微信小程序)

说明: 实现聊天功能,特色: 使用webSocket实现即时通信 发送和显示表情 数据接口: 数据接口 目录结构&#

每个Java开发人员都必须避免的9个安全错误

Checkmarx CxSAST是功能强大的源代码分析&#xff08;SCA&#xff09;解决方案&#xff0c;旨在从根本上识别&#xff0c;跟踪和修复技术和逻辑安全缺陷&#xff1a;源代码。 在这里查看 &#xff01; 自从1995年中期引入Java以来​​&#xff0c;它已经走了很长一段路。 它的…

[转]iPhone本地化总结

再做本地化的过程中参考了许多资料&#xff0c;现在的中文资料还是少之又少&#xff0c;希望能给大家一些帮助。 1、本地化字符串&#xff0c;网上那些方法我就不说了&#xff0c;我只更正一点&#xff1a;如果你的Classes下面有子文件夹会报错&#xff0c;使用下面的命令&…

【APICloud系列|9】APICloud自定义APPloader一个月未更新,快速更新的办法

时间比较紧,简单写一下流程。 1.登录APICloud后台,找到模块,自定APPLoader,直接编译ANdroid版本,下载到本地。 2.找到当时创建自定义apploader的文件夹,将下载的安装包复制过来,并重新命名为load.apk,删除原来的安装包。 3.修改load.conf配置文件.并保存关闭。 版本号从…