搜尋
首頁Javajava教程java圖形介面之佈局設計

在介面設計中,一個容器要放置許多組件,為了美觀,為組件安排在容器中的位置,這就是佈局設計。 java.awt中定義了多種佈局類,每個佈局類別對應一種佈局的策略。常用的有以下佈局類別:

•FlowLayout,依序放置組件。
•BoarderLayout,將組件放置在邊界上。
•CardLayout,將組件像撲克牌一樣疊放,而每次只能顯示其中一個組件。
•GridLayout,將顯示區域按行、列劃分成一個個相等的格子,組件依序放入這些格子中。
•GridBagLayout,將顯示區域分割成許多矩形小單元,每個元件可佔用一個或多個小單元。

其中GridBagLayout能進行精細的位置控制,也最複雜,本教程暫不討論這種佈局策略,將在專題文章中進行詳細講解。

每個容器都有一個佈局管理器,由它來決定如何安排放入容器內的組件。佈局管理器是實作LayoutManager介面的類別。

一.FlowLayout佈局(JApplet,JPanel,JScrollPane預設佈局)

FlowLayout佈局是將其中的組件按照加入的先後順序從左到右排列,一行滿之後就轉到行繼續從左到右排列,每一行中的組件都居中排列。這是一種最簡單的佈局策略,一般用於組件不多的情況,當組件較多時,容器中的組件就會顯得高低不平,各行長短不一。

FlowLayout是小型應用程式和麵板預設佈局,FlowLayout佈局的建構方法有:

1.FlowLayout(),產生一個預設的FlowLayout佈局。預設情況下,組件居中,間隙為5個像素。
2.FlowLayout(int aligment),設定每珩的組件的對齊方式。 alignment值可為 FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT。
3.FlowLayout(int aligment,int horz, int vert),設定對齊方式,並設定組件的水平間距horz和垂直間距vert,用超類Container的方法setLayout()為容器設定佈局。例如,程式碼setLayout(new FlowLayout())為容器設定 FlowLayout佈局。將元件加入容器的方法是add(元件名稱)。

二.BorderLayout佈局(JWindow、JFrame,JDialog的預設佈局)

BorderLayout佈局策略是把容器內的空間簡單劃分為東“East”,西“West”,南“South”,北“North”,中「Center」五個區域。加入組件時,都應該指明把組件放在哪一個區域。一個位置放一個組件。如果某個位置要加入多個元件,應先將要加入該位置的元件放放另一個容器中,然後再將這個容器加入這個個位置。

BorderLayout佈局的建構方法有:
(1) BorderLayout(),產生一個預設的BorderLayout佈局。預設情況下,沒有間隙。
(2) BorderLayout(int horz,int vert),設定組件之間的水平間距和垂直間距。

BorderLayout佈局策略的設定方法是setLayout(new BorderLayout())。將元件加入容器的方法是add(元件名,位置),如果加入元件時沒有指定位置,則預設為「中」位置。

BorderLayout佈局是JWindow、JFrame,JDialog的預設佈局。
【例 11-5】應用程式設有五個標籤、分別放於窗口的東、西、南、北和中五個區域。

import javax.swing.*;import java.awt.*;
public class J505{
  public static void main(String[]args){
    JLabel label1,label2,label3,label4,label5;
    JFrame mw=new JFrame("我是一个窗口");//创建一个窗口容器对象
    mw.setSize(250,200);
    Container con=mw.getContentPane();
    con.setLayout(new BorderLayout());
    label1=new JLabel("东标签");//默认左对齐
    label2=new JLabel("南标签",JLabel.CENTER);
    label3=new JLabel("西标签");
    label4=new JLabel("北标签",JLabel.CENTER);
    label5=new JLabel("中标签",JLabel.CENTER);
    con.add(label1,"East");
    con.add(label2,"South");
    con.add(label3,"West");
    con.add(label4,"North");
    con.add(label5,"Center");
    mw.setVisible(true);
  }
}

三.GridLayout佈局

GridLayout佈局是把容器劃分成若干行和列的網格狀,行數和列數由程式控制,元件放在網格的小格子中。 GridLayout佈局的特色​​是元件定位比較精確。由於GridLayout佈局中每個網格具有相同形狀和大小,因此要求放入容器的元件也應保持相同的大小。

GridLayout佈局的建構方法有:
(1) GridLayout(),產生一個單列的GridLayout佈局。預設情況下,無間隙。
(2) GridLayout(int row,int col),設定一個有行row和列col的GridLayout佈局。
(3) GridLayout(int row,int col,int horz,int vert),設定佈局的行數和列數、組件的水平間距和垂直間距。

GridLayout佈局以行為基準,當放置的組件個數超額時,自動增加列;反之,組件太少也會自動減少列,行數不變,組件按行優先順序排列(根據組件自動增減列)。 GridLayout佈局的每個網格必須填入元件,如果希望某個網格為空白,可以用一個空白標籤(add(new Label()))頂替。

【例11-6】小應用程式先將若干個按鈕和若干個標籤放入JPanel中,然後將JPanel放入JScrollPane中,最後,將JScrollPane放入小程式的視窗中,程式所建立的JScrollPane總是帶有水平和垂直滾動條,滾動面板的可視範圍小於面板的實際要求,可以移動滾動條的滑塊顯示面板原先不在可視範圍內的區域。

import java.applet.*;
import javax.swing.*;
import java.awt.*;
class MyWindow extends JFrame{
  public MyWindow(int w,int h){
    setTitle("滚动面板实例");
    Container con=getContentPane();
    con.setPreferredSize(new Dimension(w,h));
    con.setLayout(new BorderLayout());
    JPanel p=new JPanel();
    p.setLayout(new GridLayout(6,6));
    for (int i=0;i<6;i++){
      p.add(new JLabel());
      for(int j=1;j<=2;j++){
        p.add(new JButton("按钮"+(2*i+j)));
        p.add(new JLabel("标签"+(2*i+j)));
      }
      p.add(new JLabel());
    }
    p.setBackground(Color.blue);
    p.setPreferredSize(new Dimension(w+60,h+60));
    JScrollPane ScrollPane=new JScrollPane(p);
    ScrollPane.setPreferredSize(new Dimension(w-60,h-60));
    add(ScrollPane,BorderLayout.CENTER);//小程序添加滚动面板
    setVisible(true); pack();
  }
}
class ScrollPane extends JScrollPane{
  public ScrollPane(Component p){
    super(p);
    setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  }
}
public class J506 extends Applet{
  MyWindow myWindow;
  public void init(){
    myWindow=new MyWindow(400,350);
  }
}

GridLayout布局要求所有组件的大小保持一致,这可能会使用界面外观不够美观。一个补救的办法是让一些小组件合并放在一个容器中,然后把这个容器作为组件,再放入到GridLayout布局中。这就是前面所说的容器嵌套。例如,容器A使用GridLayout布局,将容器均分为网格;另有容器B和C各放入若干组件后,把B和C分别作为组件添加到容器A中。容器B和C也可以设置为GridLayout布局,把自己分为若干网格,也可以设置成其他布局。这样,从外观来看,各组件的大小就有了差异。

四.CardLayout布局

采用CardLayout布局的容器虽可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。就像一叠扑克牌每次只能显示最上面的一张一样,这个显示的组件将占据容器的全部空间。CardLayout布局设计步骤如下:
先创建CardLayout布局对象。然后,使用setLayout()方法为容器设置布局。最的,调用容器的add()方法将组件加入容器。CardLayout布局策略加入组件的方法是:
    add(组件代号,组件);
其中组件代号是字符串,是另给的,与组件名无关。

例如,以下代码为一个JPanel容器设定CardLayout布局:

CardLayout myCard = new CardLayout();//创建CardLayout布局对象
JPanel p = new JPanel();//创建Panel对象
p.setLayout(myCard);

用CardLayout类提供的方法显示某一组件的方式有两种:
(1) 使用show(容器名,组件代号)形式的代码,指定某个容器中的某个组件显示。例如,以下代码指定容器p的组件代号k,显示这个组件:
    myCard.show(p,k);
(2) 按组件加入容器的顺序显示组件。

first(容器):例如,代码myCard.first(p);
last(容器):例如 , myCard.last(p);
next(容器):例如,myCard.next(p);
previous(容器):myCard.previous(p);

【例11-7】小应用程序使用CardLayout布局,面板容器p使用CardLayout布局策略设置10个标签组件。窗口设有4个按钮,分别负责显示p的第一个组件、最后一个组件、当前组件的前一个组件和当前的组件的最后一个组件。

import java.applet.*;import java.awt.*;
import java.awt.event.*;import javax.swing.*;
class MyPanel extends JPanel{
  int x;JLabel label1;
  MyPanel(int a){
    x=a;getSize();
    label1=new JLabel("我是第"+x+"个标签");add(label1);
  }
  public Dimension getPreferredSize(){
    return new Dimension(200,50);
  }
}
public class J507 extends Applet implements ActionListener{
  CardLayout mycard;MyPanel myPanel[];JPanel p;
  private void addButton(JPanel pan,String butName,ActionListener listener){
    JButton aButton=new JButton(butName);
    aButton.addActionListener(listener);
    pan.add(aButton);
  }
  public void init(){
    setLayout(new BorderLayout());//小程序的布局是边界布局
    mycard=new CardLayout();
    this.setSize(400,150);
    p=new JPanel();p.setLayout(mycard);//p的布局设置为卡片式布局
    myPanel=new MyPanel[10];
    for(int i=0;i<10;i++){
      myPanel[i]=new MyPanel(i+1);
      p.add("A"+i,myPanel[i]);
    }
    JPanel p2=new JPanel();
    addButton(p2,"第一个",this);
    addButton(p2,"最后一个",this);
    addButton(p2,"前一个",this);
    addButton(p2,"后一个",this);
    add(p,"Center"); add(p2,"South");
  }
  public void actionPerformed(ActionEvent e){
    if (e.getActionCommand().equals("第一个"))mycard.first(p);
    else if(e.getActionCommand().equals("最后一个"))mycard.last(p);
    else if(e.getActionCommand().equals("前一个"))mycard.previous(p);
    else if(e.getActionCommand().equals("后一个"))mycard.next(p);
  }
}

五.null布局与setBounds方法

 空布局就是把一个容器的布局设置为null布局。空布局采用setBounds()方法设置组件本身的大小和在容器中的位置:
    setBounds(int x,int y,int width,int height)
组件所占区域是一个矩形,参数x,y是组件的左上角在容器中的位置坐标;参数weight,height是组件的宽和高。空布局安置组件的办法分两个步骤:先使用add()方法身容器添加组件。然后调用setBounds()方法设置组件在容器中的位置和组件本身的大小。与组件相关的其他方法:

1.getSize().width,
2.getSize().height
3.setVgap(ing vgap)
4.setHgap(int hgap);

更多java图形界面之布局设计相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?Apr 30, 2025 am 12:24 AM

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Apr 30, 2025 am 12:18 AM

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java的平台獨立性如何支持代碼可維護性?Java的平台獨立性如何支持代碼可維護性?Apr 30, 2025 am 12:15 AM

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

為新平台創建JVM面臨哪些挑戰?為新平台創建JVM面臨哪些挑戰?Apr 30, 2025 am 12:15 AM

在新平台上創建JVM面臨的主要挑戰包括硬件兼容性、操作系統兼容性和性能優化。 1.硬件兼容性:需要確保JVM能正確使用新平台的處理器指令集,如RISC-V。 2.操作系統兼容性:JVM需正確調用新平台的系統API,如Linux。 3.性能優化:需進行性能測試和調優,調整垃圾回收策略以適應新平台的內存特性。

Javafx庫如何試圖解決GUI開發中的平台不一致?Javafx庫如何試圖解決GUI開發中的平台不一致?Apr 30, 2025 am 12:01 AM

javafxeffectife addressemanddressEndressencissencies uningusement insuplatform-agnosticsCenegraphandCsSsStyling.1)itabstractsplactsplatsplatsplatsplatsplatformsthroughascenegraph,確保consistentertrenderingrenderingrenderingacrosswindows,macoswindwind,Macos,MacOs.2)

說明JVM如何充當Java代碼和基礎操作系統之間的中介。說明JVM如何充當Java代碼和基礎操作系統之間的中介。Apr 29, 2025 am 12:23 AM

JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

解釋Java虛擬機(JVM)在Java平台獨立性中的作用。解釋Java虛擬機(JVM)在Java平台獨立性中的作用。Apr 29, 2025 am 12:21 AM

JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?Apr 29, 2025 am 12:11 AM

Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能