簡述java中常用的布局管理器(簡述java中常用的布局管理器類型)

本文目錄一覽:

java中布局管理器有幾種 都有什麼

怎麼才6種呢?10多20種,你自已去JAVA的API裡面查看吧,

java.awt包中大約有

FlowLayout 流式布局

BorderLayout 邊框式布局

GridLayout 網格布局

CardLayout 卡片布局

GridBagLayout 複雜的網格布局

javax.swing包中大約有如下布局

BoxLayout 盒式布局

OverlayLayout 重疊布局

ScrollPaneLayout 類JScrollPane使用的布局管理器

ViewportLayout 類JViewport使用的布局管理器

請問JAVA有幾種布局管理器。分別怎麼用?謝謝

Java的GUI界面定義是由awt類和Swing類來完成的。它在布局管理上面採用了容器和布局管理分離的方案。也就是說,容器只管將其他小件放入其中,而不管這些小件是如何放置的。對於布局的管理交給專門的布局管理器類(LayoutManager)來完成。

其實,java在GUI方面應該是並不成功的。Awt類和swing類的結構非常複雜,加上充斥其間的子類繼承和介面實現,使得要想掌握這兩個類非常困難。這也是很多的java程序員抱怨的事情,但GUI已經成了程序發展的方向,所以這裡我們也得勉為其難了。

現在我們來看java中布局管理器的具體實現。我們前面說過,java中的容器類(Container),它們只管加入小件(Meta),也就是說,它只使用自己的add()方法向自己內部加入小件。同時他記錄這些加入其內部的小件的個數,可以通過container.getComponentCount()方法類獲得小件的數目,通過container.getComponent(i)來獲得相應小件的句柄。然後LayoutManager類就可以通過這些信息來實際布局其中的小件了。

java已經為我們提供了幾個常用的布局管理器類,例如:BorderLayout、FlowLayout、GridBagLayout等等。但在實際的布局上,我們還是會有其他的需要。我在不久前的一個問題中曾經要一個垂直的流式布局,我稱之為VflowLayout,其實BoxLayout和GridBagLayout可以完成類似的工作,但前者是swing類的成員,我的客戶端是一個Applet,不能使用,而後者必須在類生成的時候指定列數,而失去了靈活性,所以我決定重寫一個自己的布局管理器來實現。經過分析,所有的LayoutManager都要實現一個介面,就是LayoutManager Inerface或者是他的一個子介面LayoutManager2 Interface,後者用於複雜的布局管理,例如GridCardLayout。LayoutManager有五個方法需要實現,分別是:

1、public void addLayoutComponent(String name, Component comp);

2、public void removeLayoutComponent(Component comp);

3、public Dimension preferredLayoutSize(Container container);

4、public Dimension minimUMLayoutSize(Container container);

5、public void layoutContainer(Container container);

第一個方法其實就是你在使用container.add(String name,component comp);時調用的方法,例如BorderLayout為布局管理器時。但在FlowLayout中由於沒有其他的附加信息,所以不需要填充這個方法。相應的第二個方法也就不需要填充了。真正核心的方法是第三個和第五個方法,前者是最終確定Container有多大的,而後者就是決定Container中各個小件的實際位置的了。也就是說,當我們用container.setLayout(LayoutManager)後,再加入小件後,最後系統做的工作其實是LayoutManager. layoutContainer(container);和container.setSize(LayoutManager. PreferredLayoutSize(container));。下面是我的新類:VflowLayout。

package render_account;

import java.awt.*;

import java.io.*;

public class VFlowLayout implements LayoutManager,Serializable{

int hgap;

int vgap;

public VFlowLayout(){

this(5,5);

}

public VFlowLayout(int i,int j){

this.hgap=i;

this.vgap=j;

}

public void addLayoutComponent(String name, Component comp){

}

public void removeLayoutComponent(Component comp){

}

public Dimension preferredLayoutSize(Container container){

synchronized(container.getTreeLock()){

Dimension dimension1=new Dimension(0,0);

int i=container.getComponentCount();

for(int j=0;j

Component component = container.getComponent(j);

if(component.isVisible()){

Dimension dimension2=component.getPreferredSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);

if(j0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;

}

}

Insets insets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;

dimension1.width+=insets.left+insets.right+hgap*2;

Dimension dimension=dimension1;

return dimension;

//return(new Dimension(50,200));

}

}

public Dimension minimumLayoutSize(Container container){

synchronized(container.getTreeLock()){

Dimension dimension1=new Dimension(0,0);

int i=container.getComponentCount();

for(int j=0;j

Component component = container.getComponent(j);

if(component.isVisible()){

Dimension dimension2=component.getMinimumSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);

if(j0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;

}

}

Insets insets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;

dimension1.width+=insets.left+insets.right+hgap*2;

Dimension dimension=dimension1;

return dimension;

}

}

public void layoutContainer(Container container){

synchronized(container.getTreeLock()){

Insets insets=container.getInsets();

int vSpace=container.getSize().height-(insets.top+insets.bottom+vgap*2);

int componentCount=container.getComponentCount();

int left=insets.left+hgap;

int totalHeight=0;

int width=0;

int componentStart=0;

for(int i=0;i

Component component=container.getComponent(i);

if(component.isVisible()){

Dimension dimension=component.getPreferredSize();

component.setSize(dimension.width,dimension.height);

if(totalHeight==0 || totalHeight+dimension.height=vSpace){

if(totalHeight0)

totalHeight+=vgap;

totalHeight+=dimension.height;

width=Math.max(width,dimension.width);

}else{

moveComponents(container,insets.top+vgap,left,width,componentStart,i);

totalHeight=0;

left+=hgap+width;

width=dimension.width;

componentStart=i;

}

}

}

moveComponents(container,insets.top+vgap,left,width,componentStart,componentCount);

}

}

private void moveComponents(Container container,int top,int left,int width,int componentStart,int componentEnd){

synchronized(container.getTreeLock()){

for(int i=componentStart;i

Component component=container.getComponent(i);

if(component.isVisible()){

component.setLocation(left,top);

top+=component.getPreferredSize().height+vgap;

}

}

}

}

public void setHgap(int i){

this.hgap=i;

}

public void setVgap(int i){

this.vgap=i;

}

public int getHgap(){

return(this.hgap);

}

public int getVgap(){

return(this.vgap);

}

}

大家可以試一下

什麼是容器的布局,試列舉並簡述java中常用的幾種布局策略

容器的布局是指對添加的各個組件進行有序的、統一的對位置進行編排,使其更加美觀。

JavaFX典型的布局策略:

1、lowPane面板

它採用的布局策略是:按照控制項的添加次序按個擺放,按照從上到下、從左到右的次序擺放。當窗口的大小發生變化後,場景的大小也自動跟著變化,面板的大小也跟著變化,並且會重新計算各個控制項的位置,重新擺放各個控制項的位置。

2、GridPane面板

它採用的布局策略是:將整個面板劃分為若干個格子,每個格子的大小是一樣的,每個格子中可以放置一個控制項,類似於表格的方式。

3、BorderPane面板

它採用的布局策略是:將整個面板劃分五個區域,分別是上、下、左、右、中,每個區域可以放置一個控制項。

4、HBox面板

HBox是將所有的控制項放在同一行,無論有多少個控制項都是放在同一行。

5、Box面板

VBox的布局策略與HBox類似,不過VBox是將所有的控制項放在同一列。

擴展資料:

容器沒有布置它自己構件的功能,而把這個責任授權給一個布局管理器。

順序布局是最基本的一種布局,面板的默認布局就是順序布局。順序布局指的是把圖形元件一個接一個地放在面板上。

邊界布局包括5個區:北區、南區、東區、西區和中區。這5個區在面板上的分布規律是「上北下南,左西右東」。

參考資料:百度百科-java軟體開發

java布局管理器有哪幾種各自的特點

大概講簡單的三種:

①FlowLayout流布局管理器,它的布局方式是在一行上排列組件,當一行沒有足夠空間時,則回行顯示,默認為居中

②BorderLayout邊界布局管理器,它的布局方式是將容器劃分為5個部分

③GridLayout網格布局管理器,它的布局方式是將容器按照用戶設置平均劃分成若干網格

java中描述常見的幾種布局特點及用法

Java的GUI界面定義是由AWT類包和Swing類包來完成的,對於布局的管理交給專門的布局管理器類(LayoutManager)來完成。

Java中的布局管理器類有:FlowLayout、BorderLayout、GridLayout、GridBagLayout等,

下面是他們的一些特點:

CardLayout 將組件象卡片一樣放置在容器中,在某一時刻只有一個組件可見

FlowLayout 將組件按從左到右而後從上到下的順序依次排列,一行不能放完則折到下一行繼續放置

GridLayout 形似一個無框線的表格,每個單元格中放一個組件

BorderLayout 將組件按東、南、西、北、中五個區域放置,每個方向最多只能放置一個組件

GridBagLayout 非常靈活,可指定組件放置的具體位置及佔用單元格數目

BoxLayout 就像整齊放置的一行或者一列盒子,每個盒子中一個組件

SpringLayout 根據一組約束條件放置子組件

ScrollPaneLayout 專用於JScrollPane,含一個Viewport,一個行頭、一個列頭、兩個滾動條和四個角組件

OverlayLayout 以彼此覆蓋的形式疊置組件

ViewportLayout JViewport的默認布局管理器

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/309422.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-04 19:31
下一篇 2025-01-04 19:31

相關推薦

  • int類型變數的細節與注意事項

    本文將從 int 類型變數的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變數進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變數。 一、定義與聲明 int…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • exzwm:讓Emacs更像窗口管理器

    exzwm是一個Emacs擴展,它提供了窗口管理器的功能,讓你可以使用Emacs來管理窗口,而不是使用獨立的窗口管理器。通過exzwm,你可以為你的Emacs設置類似i3或xmon…

    編程 2025-04-29
  • Python中的Bool類型判斷

    本篇文章旨在講解Python中的Bool類型判斷。在Python中,Bool類型是經常使用的一種類型,因此掌握其用法非常重要。 一、True和False 在Python中,True…

    編程 2025-04-29
  • Python函數類型有哪些

    本文將從以下幾個方面詳細闡述Python函數類型。 一、內置函數 Python的內置函數是指在Python編程語言中提供的可以直接使用的函數,不需要通過導入模塊等方式引入。 部分常…

    編程 2025-04-29
  • Python中的整數類型int類總覽

    本文將從多個方面,對Python中的整數類型int類進行全面介紹和闡述。 一、數據類型及基本操作 在Python中,整數類型的數據類型為int。在Python3.x中,整數類型的范…

    編程 2025-04-28
  • Python變數類型用法介紹

    Python是一種解釋型編程語言,它提供了豐富的數據類型,包括數字、字元串、列表、元組、集合、字典等。Python變數類型的定義是Python程序開發的基礎,本文將從以下幾個方面對…

    編程 2025-04-28
  • Python序列的常用操作

    Python序列是程序中的重要工具,在數據分析、機器學習、圖像處理等很多領域都有廣泛的應用。Python序列分為三種:列表(list)、元組(tuple)和字元串(string)。…

    編程 2025-04-28

發表回復

登錄後才能評論