體驗Java SE 6 中的 GroupLayout

來源:互聯網
上載者:User

原文 http://blog.csdn.net/wguoyong/article/details/6898149

它將組件按層次分組,以決定它們在 Container 中的位置。GroupLayout 主要供產生器使用,但也可以手工編碼。分組由 Group 類的執行個體來完成。GroupLayout 支援兩種組。串列組
(sequential group) 按順序一個接一個地放置其子項目。並行組 (parallel group) 能夠以四種方式對齊其子項目。

每個組可以包含任意數量的元素,其中元素有 GroupComponent 或間隙 (gap)。間隙可被視為一個具有最小大小、首選大小和最大大小的不可見組件。此外,GroupLayout 還支援其值取自 LayoutStyle 的首選間隙。

元素類似於一個彈簧。每個元素都有一個範圍,由最小大小、首選大小和最大大小指定。間隙的範圍由開發人員指定,或者由 LayoutStyle 確定。Component 的範圍通過 Component 的 getMinimumSizegetPreferredSize 和getMaximumSize 方法確定。此外,添加 Component 時,可以指定使用一個特定範圍,而不使用該組件的範圍。Group 的範圍由組的類型確定。ParallelGroup 的範圍是其元素範圍的最大值。SequentialGroup 的範圍是其元素範圍的總和。

GroupLayout 將每個軸 (axis) 單獨對待。也就是說,存在一個表示水平軸的組和一個表示垂直軸的組。水平組負責確定沿水平軸的最小大小、首選大小和最大大小,並設定所包含組件的 x 和寬度。垂直組負責確定沿垂直軸的最小大小、首選大小和最大大小,並設定所包含組件的 y 和高度。每個 Component 都必須同時存在於水平組和垂直組中,否則,在版面配置階段中或者在請求最小大小、首選大小或最大大小時,將拋出 IllegalStateException

 

Java SE 6 中包含一個新的 GroupLayout ,從GroupLayout的單詞意思來看,它是以Group(組)為單位來管理布局,也就是把多個組件(如:JLable、JButton)按地區劃分到不同的Group(組),再根據各個Group(組)相對於水平軸(Horizontal)和垂直軸(Vertical)的相片順序來管理。下面我們針對這樣一個介面看看它的用法:

首先劃分組:

1、按水平(Horizontal)方向劃分:

hpg1  : JLabel 所在組(只有一個組件可以不用分組)
hpg2a : 左邊兩個JCheckBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2b : 右邊兩個JChecKBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2H : hpg2a 和 hpg2b 兩個組沿著水平軸(Horizontal)順序排列,構成一個SequentialGroup
hpg2  :  JTextBox和組hpg2H 平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg3  :  兩個JTextBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup

另外JLabel 、hpg2、hpg3 沿著水平軸(Horizontal)順序排列,構成一個SequentialGroup


2、按垂直(Vertical)方向劃分:


vpg1 : JLabel、JTextBox 、JButton(Find)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg2 : 上邊兩個JChecKBox、JButton(Cancel)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg3 : 下邊兩個JChecKBox平行於垂直軸(Vertical)排列,構成一個ParallelGroup

另外vpg1、vpg2、vpg3 三個組沿著垂直軸(Vertical)順序排列,構成一個SequentialGroup

3、編碼:水平和垂直兩個方向我們都必須設定,實現方法詳見程式。
addComponent:向Group裡添加組件,如JLabel、JTextBox
addGroup    : 向Group裡添加組

/// GLayout.java
package lee;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GLayout extends JFrame
{
   public GLayout()
   {
    super("Find");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //String laf = UIManager.getCrossPlatformLookAndFeelClassName();
    String laf = UIManager.getSystemLookAndFeelClassName();
    try {
         UIManager.setLookAndFeel(laf);
    } catch (UnsupportedLookAndFeelException exc) {
     System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
    } catch (Exception exc) {
     System.err.println("Error loading " + laf + ": " + exc);
    }
    JLabel label1 = new JLabel("Find What:");
    JTextField textField1 = new JTextField();
    JCheckBox caseCheckBox = new JCheckBox("Match Case");
    JCheckBox wholeCheckBox = new JCheckBox("Whole Words");
    JCheckBox wrapCheckBox = new JCheckBox("Warp Around");
    JCheckBox backCheckBox = new JCheckBox("Search Backwards");
    JButton findButton = new JButton("Find");
    JButton cancelButton = new JButton("Cancel");
   
    Container c = getContentPane();
    GroupLayout layout = new GroupLayout(c);
    c.setLayout(layout);
    
    //自動設定組件、組之間的間隙
    layout.setAutoCreateGaps(true);
    layout.setAutoCreateContainerGaps(true);

  //LEADING -- 靠左對齊    BASELINE -- 底部對齊  CENTER -- 中心對齊
    GroupLayout.ParallelGroup hpg2a = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2a.addComponent(caseCheckBox);
    hpg2a.addComponent(wholeCheckBox);
     
    GroupLayout.ParallelGroup hpg2b = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2b.addComponent(wrapCheckBox);
    hpg2b.addComponent(backCheckBox);

    GroupLayout.SequentialGroup hpg2H = layout.createSequentialGroup();
    hpg2H.addGroup(hpg2a).addGroup(hpg2b);
  
    GroupLayout.ParallelGroup hpg2 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2.addComponent(textField1);
    hpg2.addGroup(hpg2H);
  
    GroupLayout.ParallelGroup hpg3 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg3.addComponent(findButton);
    hpg3.addComponent(cancelButton);

  //水平
    layout.setHorizontalGroup(layout.createSequentialGroup()
        .addComponent(label1).addGroup(hpg2).addGroup(hpg3));    
    
    //設定兩個Button在水平方向一樣寬
    layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { findButton, cancelButton });
    //layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { caseCheckBox, wholeCheckBox, wrapCheckBox, backCheckBox});

    GroupLayout.ParallelGroup vpg1 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
    vpg1.addComponent(label1);
    vpg1.addComponent(textField1);
    vpg1.addComponent(findButton);
    
    GroupLayout.ParallelGroup vpg2 = layout.createParallelGroup(GroupLayout.Alignment.CENTER);
    vpg2.addComponent(caseCheckBox);
    vpg2.addComponent(wrapCheckBox);
    vpg2.addComponent(cancelButton);

    GroupLayout.ParallelGroup vpg3 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
    vpg3.addComponent(wholeCheckBox);
    vpg3.addComponent(backCheckBox);

  //垂直
   layout.setVerticalGroup(layout.createSequentialGroup()
        .addGroup(vpg1).addGroup(vpg2).addGroup(vpg3));
    
    setLocation(200,200);
    pack();
    setVisible(true);
  }
  public static void main(String[] args)
{
  new GLayout();
}
}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.