有時在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.pswp.cn/news/374383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374383.shtml
英文地址,請注明出處:http://en.pswp.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…