在开发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中,一个布局管理器是不够的相关推荐

  1. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  2. Java中BorderLayout布局管理器的两种排列实现方式

    java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame窗口分为东西南北中五个区域,每个区域仅限于放一个组件,如加入多个,前免得会被覆盖,解决方法为:可以在一个区域中加入 ...

  3. 以下关于java中布局管理说法错误的是_对于 Java 中的布局管理器,以下说法中错误的是( )。_2019复习答案_学小易找答案...

    [单选题]下列哪个酶与丙酮酸生成糖无关? [单选题]宋代( )的产地是当时的福建建安. [单选题]建筑平面图中,外部尺寸一般标注( )尺寸. [单选题]MCS - 51 单片机的 CPU 主要的组成部 ...

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

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

  5. Java编程基础 - 布局管理器

    1. 布局管理器介绍 组件在容器(比如JFrame)中的位置和大小是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理. java共提供了五种布局管理器:流式布局管 ...

  6. Java Swing的布局管理器

    在Swing的实际开发中,开发人员在添加组件到容器中的时候可以自由调整组件的大小和在容器中的位置,这样虽然很灵活,但操作起来却很麻烦.为了加快开发速度,Java 提供了一些布局管理器,它们可以将组件进 ...

  7. 【JAVA】-- Java五大常用布局管理器(BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout)

    在Swing组件中,有JFrame和JDialog这样的顶级容器(也叫窗口),顶级容器不能放置在其他容器中,可完成窗口大小化等基本功能. 也有JPanel这样的面板组件,比较复杂的布局,需要布局管理器 ...

  8. java 网格包,求大神解答:JAVA网格包布局管理器小程序问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为什么我在这个程序上加入了一个Container对象就出问题了,求解答,要如何改: package A; import java.awt.*; impor ...

  9. java 网格包布局管理器_java :网格包布局管理器GridBagConstraints的应用

    代码如下:···(略)publicclassApp12_13extendsJFrame{staticApp12_13frm=newApp12_13();staticJLabeljlab=newJLab ...

最新文章

  1. css表格文本居中的指令,CSS似乎无法在表格单元中居中文本
  2. Ubuntu13.04 下源码安装Rapidsvn
  3. Netty 和 RPC 框架线程模型分析
  4. 人生财富值得珍藏的文字
  5. multi task训练torch_Multi-task Learning的三个小知识
  6. 因果关系固定搭配知识库项目CausalCollocation
  7. 基于seaborn的相关性热力图可视化分析
  8. 【2018徐州ICPC Gym-102012 M】Rikka with Illuminations【计算几何】
  9. 微信小程序项目实例——印记
  10. python关闭指定浏览器页面_Python自动关闭浏览器关闭网页的方法
  11. 程序员涨工资大多数靠跳槽吗?
  12. 360儿童手表显示服务器错误,360儿童卫士刷机失败怎么办 刷机方法
  13. urp教务系统简单利用
  14. 利用SSRF攻击Redis
  15. seo常用工具,seo常用工具搜行者SEO
  16. 脱水冷冻干燥宠物食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 网易有道的面试也太难了吧,这都堪比我朋友三面的阿里了!
  18. 树莓派配置记录——aria2
  19. 前端Ajax实现预览TXT文档(兼容UTF-8,ANCII,Unicode)
  20. Android Binder(也许是最容易理解的)

热门文章

  1. 利用反射机制创建新类的两种方式及比较
  2. spring boot测试_测试Spring Boot有条件的合理方式
  3. fluent瞬态_Java中的瞬态关键字及其使用
  4. 不停机与停机更新_Istio的零停机滚动更新
  5. 度量空间的应用_使用Dropwizard度量标准监视和测量无功应用
  6. grunt 插件_从Grunt测试Grunt插件
  7. hibernate自定义_如何自定义Hibernate脏检查机制
  8. Java 11:将集合转换为数组
  9. JasperReports:棘手的部分
  10. 使用JDK 8将收藏转换为地图