1 邊框布局
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new FlowLayout());
憑著我們現在所積累的閱讀程序的功夫,應該能夠很快地知道我們通過第一條語句創建了一個容器JPanel類的panel1。
而接下來,我們則調用了panel1.setLayout(new FlowLayout()),在上一章中,我們一直沒有對它進行相應的分析。現在該是揭開它的面紗的時候了。
單詞layout的中文意思是「布局」、「布置」,setLayout就是設置布局格式。也就是說,容器panel1的方法setLayout是用來設置布局格式的。那麼,我們一直用的是什麼模式呢?對,就是後面括弧里的FlowLayout()。顧名思義,也就是流布局方式。這是一種順其自然的方式:從左到右,一個個對象地擺放,擺不下,就擺到下一行。所以,我們就無法去控制它。
從本章開始,我們就要學習一種控制布局的方法。在Java語言中,提供了各種布局管理器,以便大家能夠達到這一目的。
通常我們最常使用的布局管理器是:Border Layout(邊框布局管理器),如下圖所示,邊框布局管理器將一個屏幕分成了五個部分:東、南、西、北、中。
如果要使用這種邊框布局管理進行布局控制,我們必須先將「容器」設置為「邊框布局控制模式」,具體來說,就是當調用setLayout方法為容器設置布局控制模式時,參數設置為BorderLayout。例如:
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new BorderLayout());
然後,我們就可以在使用容器的add方法添加部件時,附加上位置參數,使得該部件顯示在指定的位置上。位置參數分別是:
BorderLayout.NORTH 位置為北
BorderLayout.SOUTH 位置為南
BorderLayout.EAST 位置為東
BorderLayout.WEST 位置為西
BorderLayout.NORTH 位置為中心
實例說明
下面,我們就來試一試,使用按鈕排出五個方向!請創建一個testBorder.java,輸入以下源程序:
源程序:useTextArea.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testBorder extends JApplet
{
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new BorderLayout());
JButton north=new JButton("North");
JButton south=new JButton("South");
JButton east=new JButton("East");
JButton west=new JButton("West");
JButton center=new JButton("Center");
panel1.add(north,BorderLayout.NORTH);
panel1.add(south,BorderLayout.SOUTH);
panel1.add(east,BorderLayout.EAST);
panel1.add(west,BorderLayout.WEST);
panel1.add(center,BorderLayout.CENTER);
}
}
然後,我們使用javac編譯這個程序,然後編輯一個顯示這個Java Applet的HTML頁面。最後調用appletviewer來觀察這個頁面
為了試一下,如果並沒有在每個位置都安排一個部件,那麼會怎麼樣呢?我們修改一下程序,將panel1.add(west,BorderLayout.WEST);這一行注釋掉(就是在前面加上「//」號),也就是不顯示西邊的按鈕,看一下結果如何。正如上圖(圖10-3)所示,西邊由於沒有部件,因此「中」就朝西靠,「佔領」了它的位置。
而如果我們修改一下程序,讓中間的按鈕不顯示的話,就會出現如圖10-5的樣子,中間的區域並未並佔領,而是空在那裡了!這是與其它位置不同的地方,大家一定要記住。
一些提示:
其實這很好理解,如果中間的那一塊的位置被其它位置上的部件佔領的話,就會使得分不清「東」、「南」、「西」、「北」了。倒成了「左上角」、「左下角」、「右上角」、「右下角」了。
2 網格布局
實例說明
下面,我們來看一個新的程序!首先創建一個testGrid.java文件,並輸入以下源程序:
源程序:testGrid.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testGrid extends JApplet
{
String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",
"No.6","No.7","No.8","No.9"};
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(3,3));
for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));
}
}
然後,我們使用javac編譯這個程序,然後編輯一個顯示這個Java Applet的HTML頁面。最後調用appletviewer來觀察這個頁面
我們主要是關心如何擺放各個部件,而不是如何構建一個程序。所以,正如本例中的按鈕一下,這一章中的所有部件都是一個樣子,沒有任何作用。這樣也使得程序盡可能地變短了,更易於大家閱讀和理解程序。
下面,我們就一起來看一下上面的這個程序。
1) String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",
"No.6","No.7","No.8","No.9"}
我想大家都能很輕松地讀懂這條語句,我們在此定義了一個字元串數組buttonLabels,它有9個字元串成員,也就是我們後面定義的9個按鈕的標簽文本。
值得注意的是,大家一定要知道,buttonLabels[1]表示哪個字元串!如果您的答案是「No.1」的話,就錯了!正確的答案是「No.2」,這是因為在數組中索引值是從0開始的,也就是說如果要使用「No.1」的話,應該使用buttonLabels[0]。這對更好地理解後面的程序十分重要,也是基本功之一。
2) JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(3,3));
在這兩行程序中,我們首先定義了一個容器部件panel1。然後調用setLayout方法設置布局管理器。這里我們使用了一個新的布局管理器:GridLayout,網格布局管理器。
我們注意到GridLayout的後面帶了兩個參數:3,3。這有什麼用呢?我們一起來看一下GridLayout方法的定義:
public GridLayout (int rows,int cols)
我們看一下這兩個參數,首先它們都是int型—整型的。那麼它們分別起到什麼作用呢?我們還是採用顧名思義法吧!row的中文意思是行,col的中文意思是列,後面加上一個s,是這兩個單詞的復數形式。
好,我們現在串起來想一下,我們定義了一個網格布局,然後定了它的行、列數!這不就畫出了這個網格了嗎?如果我們在語句是使用GridLayout(5,5)的話,就會把整個容器分成25個單元
而我們在程序中使用的是GridLayout(3,3),所以它就將整個容器分成了
注意:
這種劃分是一種邏輯上的,暗藏式的劃分,而不會把格子給劃出來。另外,我們這里舉的兩個例子行、列都相等,其實完全可以不等。
3) for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));
這是一個循環結構的程序。我們先看循環語句,循環的初值是「x=0」,繼續執行循環的條件語句是「xbuttonLabels.length就是用來請得字元串數組buttonLabels的長度!也就是這個字元串數組中有多少個字元串?我們知道,我們在該數組中定義了9個。
從程序中,我們可以獲知,當x=buttonLabels.length時,循環就將結束,應為它不滿足條件x別忘了,我們使用buttonLabels[0]表示第一個字元串,buttonLabels[1]表示第二個字元串……,那麼最後一個字元串就應該是buttonLabels[buttonLabels.length-1]嘛。
在循環中,我們使用容器提供的add方法,將新定義的按鈕部件添加進去。
有時,我們可能想獲得象下圖所示的布局效果!讓各個部件之間存在一些間隙。使用Java的網格布局可以實現嗎?
我很高興地回答你:「可以!」,我們可以使用GridLayout的另一種構造器方法(簽名不同)來實現:
public GridLayout (int rows,int cols,int hgap,int vgap)
在這個方法中,可以帶上四個整型參數,前兩個我們已經很熟悉了,行數與列數。後面則是兩個新的參數。
第一個是hgap,其中gap的意思是間隙、空隙的意思,而h則是horizontal(水平)的第一個字母。也就是說,我們可以通過hgap參數設置橫向的間隙。
第二個是vgap,v則是vertical(垂直)的第一個字母。也就是說,我們可以通過vgap參數設置縱向的間隙。
自測練習
1)_________________是網格布局管理器。
a.BorderLayout b.GridLayout c.ReseauLayout
d.FlowLayout
利用以下代碼回答問題2、3、4、5:
2)這個布局中有__________行?
a.7行 b.5行 c.6行 d.8行
3)這個布局中有__________列?
a.7行 b.5行 c.6行 d.8行
4)這個布局將容器分為_________個部分?
a.48個 b.35個 c.30個 d.40個
5)第5個部件位於__________位置。
a.左上角 b.左下角 c.右上角 d.右下角 e.中間
6)根據以下界面,編寫一個程序
圖10-12 練習題圖
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
7) 如果我們構建一個5*5的網格布局,但只在該容器中加入17個按鈕,將會出現什麼情況?請編寫一個程序,來試一試效果。
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
練習答案
1)b 沒什麼好解釋的,請大家記住!
2)a 第一個參數是行數,因此是7行。
3)b 第二個參數是列數,因此為5列。
4)b 7行5列,其7*5,35個部分嘛。
5)c 第5個部件是第一行的最後一個,當然在右上角嘛。
6)下面是一個實現的程序實例:
源程序:lianxi10_2.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class lianxi10_2 extends JApplet
{
String buttonLabels[]={"1","2","3","4","5","6","7",
"8","9","*","0","#"};
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(4,3,10,10));
for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));
}
}
7)下面是一個實現的程序實例:
源程序:lianxi10_3.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class lianxi10_3 extends JApplet
{
String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",
"No.6","No.7","No.8","No.9","No.10","No.11","No.12",
"No.13","No.14","No.15","No.16","No.17"};
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(5,5));
for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));
}
}
這個程序使用javac編譯完後,編寫一個包含這個類的HTML頁面,再用appletviewer來觀察發現運行結果如下圖所示:
圖10-13 練習答案圖
這個輸出是不是令你感到十分意外,整個程序根本不按要求分成5列,所以我們從這里得到一個使用網格布局中要十二分注意的一點:「請別忘了將網格填滿」。否則程序的輸出將不可預料。
一些提示:
如果你真的沒有那麼多東西來「佔領」網格的話,我建議你使用一個空標簽來填補這個空白的網格,使得程序的輸出如你所願。使用空標簽的方法很容易:
panel1.add(new Label(「」));
從這里,我們也看出了,我們學習過的流布局管理器、邊框布局管理器,以及我們剛學習過的網格布局管理器都比較死板,不夠高級。
10.3 組合布局
傳授新知
正如我們在上一小節結束的時候說的一樣,各種布局管理器都有自己的缺點,沒有一種能夠真正地完全滿足我們編寫GUI程序時的要求。
而在Java語言中,允許在容器中加入其他容器,這樣每個容器可以根據自己的需要採用不同的布局管理器,組合成為一個我們所需要的GUI程序界面。這種方法,我們就稱之為組合布局。
注意:
與流布局、邊框布局、網格布局不同,組合布局並不是一個新的布局管理器,它是通過結合各種布局管理器的優點,將它們組合地應用在GUI程序界面的開發中。這是一種布局管理的方法。也可以說是一種GUI程序界面的開發技巧。
當我們設計GUI程序界面時,最好先在紙上把它畫出來,然後「分塊解決」。也就是將能夠組合在一起的部件找出來,將它們放在一個容器里,並為它們選擇合適的布局管理器。然後把這些容器擺放在一起,就解決了。
設計時還要考慮到窗體大小發生改變的時候,引起的部件形體變化。這方面,請你熟記幾個設計技巧:
1) 對於那些要求扁平狀的部件,我們應該將它放置在邊框布局中的南面或北面;
2) 對於那些要求細高狀的部件,我們應該將它放置在邊框布局中的東面或西面;
3) 對於那些可以隨著窗體改變大小部分,我們可以將它放置在邊框布局的中間;
4) 如果我們要求部件保持大小相同,那麼,我們就應該採用網格布局。
下面,我們就通過幾個實際的例子,來讓大家領會和掌握這種設計的思路與方法。
實例說明
我們首先創建一個testCombination.java文件,然後輸入以下源程序:
源程序:testCombination.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testCombination1 extends JApplet
{
public void init()
{
Frame frame1=new Frame("testCombination1");
frame1.setLayout(new BorderLayout());
TextArea text1=new TextArea();
frame1.add(text1,BorderLayout.CENTER);
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridLayout(1,3,10,5));
panel1.add(new JButton("A"));
panel1.add(new JButton("B"));
panel1.add(new JButton("C"));
frame1.add(panel1,BorderLayout.SOUTH);
frame1.pack();
frame1.show();
}
}
然後,我們使用javac編譯這個程序,然後編輯一個顯示這個Java Applet的HTML頁面。最後調用appletviewer來觀察這個頁面,如下圖所示:
圖10-14 程序testCombination.java的輸出
正如上圖所示,程序的輸出與以前不同,各個部件不是顯示在Appletviewer程序框中,而是顯示在另一個窗口中。
這是怎麼回事呢?下面我們就一起來看一下這個程序!
傳授新知
在以前的程序中,我們一直都是使用容器JPanel,面板。而我們在這個程序中引進了一個新的容器Frame。使用了這個容器後,就會新創建一個窗口。這也就是為什麼程序的輸出有這么大的變化的原因。
1)Frame frame1=new Frame("testCombination");
這條語句,定義了一個Frame容器frame1,然後使用new操作符調用構造器方法,後面帶的參數「testCombination」則是這個Frame的標題。
一些提示:
其實大家能Frame所體現出來的效果是很熟悉的,它等價於Windows中的窗體。而Frame的標題就是窗體的標題。
2) frame1.setLayout(new BorderLayout());
與JPanel容器一樣,我們可以調用setLayout方法來設置Frame的布局管理器。在這里,我們將Frame容器frame1的布局管理器設置成為邊框布局管理器(也就是我們在10.1小節中學習過的布局管理器)。
3) frame1.add(text1,BorderLayout.CENTER);
緊接著,我們調用frame1的add方法,將文本區部件text1添加到frame1容器中來。注意我們設置了它的位置:BorderLayout.CENTER。
這是因為,我們希望這個文本區能夠隨著窗體的大小變化而變化。所以適合將其放在在中間位置。
4) panel1.setLayout(new GridLayout(1,3,10,5));
我們又定義了一個JPanel容器panel1,並將其的布局管理器設置為網格布局管理器。並通過指定參數,使得整個panel1被分成1行3列,水平空隙為10的網格。
5) frame1.add(panel1,BorderLayout.SOUTH);
這是組合布局方法最重要的一步,我們將panel1這個容器,加入到了frame1這個容器中去了。並且指定了panel1這個容器在整個frame1中所佔的位置:BorderLayout.SOUTH,也就是下邊。這樣,panel1中包含的三個按鈕就會永遠(不管窗體大小如何改變)呆在文本區的下邊,而且三個按鈕的大小會根據窗體大小的改變而改變。
一些提示:
這是因為,panel1中的按鈕是用網格布局的。
6) frame1.pack();
frame1.show();
與JPanel不一樣,使用Frame容器,不能夠直接顯示了出來。我們必須調用Frame容器的show方法才能使得Frame顯示出來。
而在使用show方法之前,我們還需要使用pack方法將Frame中的內容做一個整合。請記住這里的使用方法。
4 GridBag布局
實例說明
到現在為止,我們已經學習了邊框布局、網格布局以及組合布局,現在大家試一試編寫一個程序,
怎麼樣,挺有難度的吧!完成這個GUI得花很多心思去設計組合,十分討厭,下面我們就使用一個新的布局管理器GridBagLayout來解決這種難題。
首先,輸入以下源程序:
源程序:testGridBag.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testGridBag extends JApplet
{
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridBagLayout());
GridBagConstraints gbdc=new GridBagConstraints();
gbdc.fill=GridBagConstraints.BOTH;
gbdc.weightx=1;
gbdc.weighty=1;
panel1.add(new JButton("No.1"),gbdc);
panel1.add(new JButton("No.2"),gbdc);
panel1.add(new JButton("No.3"),gbdc);
gbdc.gridwidth=2;
gbdc.gridx=0;
panel1.add(new JButton("No.4"),gbdc);
gbdc.gridx=2;
gbdc.gridwidth=1;
gbdc.gridheight=2;
panel1.add(new JButton("No.5"),gbdc);
gbdc.gridx=0;
gbdc.gridheight=1;
panel1.add(new JButton("No.6"),gbdc);
gbdc.gridx=1;
panel1.add(new JButton("No.7"),gbdc);
gbdc.gridx=0;
gbdc.gridwidth=2;
panel1.add(new JButton("No.8"),gbdc);
gbdc.gridx=2;
gbdc.gridwidth=1;
panel1.add(new JButton("No.9"),gbdc);
}
}
在這個程序中,我們使用了GridBagLayout輕松地完成了這個界面的設計,允分凸現出它的強大。可以這么說,GridBagLayout是Java語言中最強大的布局管理器。
GridBagLayout,從名字上看,就知道它與GridLayout有一定的淵源,是的,GridBagLayout的確與其十分類似,也是使用網格來進行布局管理的。但與GridLayout(網格布局)不同的是,GridBagLayout不像網格布局一相,需要所有的部件的大小、形狀相同。而且還可以將某一個部件放在一個固定的位置上。
下面,我們一起來分析一下testGridBag.java程序。
1) panel1.setLayout(new GridBagLayout());
在調用setLayout方法時,指定為GridBagLaoyout,使panel1使用GridBag布局管理。
2) GridBagConstraints gbdc=new GridBagConstraints();
GridBagLayout布局管理器是通過一個GridBagConstraints類來實現神奇的效果的。所以,我們要在使用時先定義一個GridBagConstraints類的對象。在這個程序中,我們定義了一個GridBagConstraints類的對象gbdc。
3) gbdc.fill=GridBagConstraints.BOTH;
由於網格單元可能比該單元中的部件大,如果是這樣,部件放置在單元格內會有一些多餘空間。在默認情況下,部件不會擴張,也就是不會填充這個多餘空間。
GridBagConstraints提供了一個fill屬性,我們可以通過設置它的值來起到不同的效果。
¨ GridBagConstraints.NONE:不擴張,是默認值;
¨ GridBagConstraints.HORIZONTAL:部件水平擴張,將水平方向的多餘空間填滿;
¨ GridBagConstraints.VERTICAL:部件垂直擴張,將垂直方向的多餘空間填滿;
¨ GridBagConstraints.BOTH:部件同時向兩個方向擴張,將單元格填滿。
4) gbdc.weightx=1;
gbdc.weighty=1;
weightx和weighty是GridBagConstraints提供的另一對屬性。它的取值是整型數,默認值為0。用來設置行(weightx)、列(weighty)的「重量」,如果值為0的話,所有的部件都會緊收在一起,聚集在中央,如圖10-17所示。
而如果取值為其它數字,則會根據值來分配空間。
5) panel1.add(new JButton("No.1"),gbdc);
panel1.add(new JButton("No.2"),gbdc);
panel1.add(new JButton("No.3"),gbdc);
在沒有任何約束的時候,向gbdc中添加按鈕,這時效果與採用網格布局的效果完全一樣。一個接著一個地「佔領」單元格。
6) gbdc.gridwidth=2;
gbdc.gridx=0;
panel1.add(new JButton("No.4"),gbdc);
由於第四個按鈕(No.4)是寬度是2,在GridBagLayout中,是由gridwidth屬性來控制添加進入的部件的寬度的。
我們通過gbdc.gridwidth=2將其設置為2,這樣,再添加進入的部件就會變成為2個單元格的寬度。
另外,我們再使用gbdc.gridx=0讓其另起一行,從最左邊的單元格開始填充。
因此,我們發現第四個按鈕被加在了第二行,寬度為2個單元格。
7) gbdc.gridx=2;
gbdc.gridwidth=1;
gbdc.gridheight=2;
panel1.add(new JButton("No.5"),gbdc);
接下來,我們要擺放第五個按鈕,這個按鈕將從第3個單元開始填充,其寬度為一個單元格,而高度則為兩個單元格。
因此,我們首先使用用gbdc.gridx=2,使得下一個添加的部件(第五個按鈕)放入第3個單元格(0代表第1個單元格,因此第3個單元格應該是2)。
由於,前面我們已經將gridwidth設置為2了,因此,我們需要使用gbdc.gridwidth=1,將其值設置回1。
最後使用gdbc.gridheight=2,使得添入的部件的單元格縱向跨越兩個單元格。
8) gbdc.gridx=0;
gbdc.gridheight=1;
panel1.add(new JButton("No.6"),gbdc);
我想這一段程序,大家應該都不會再有什麼理解上的問題了吧!主要提醒大家注意的是,我們使用gbdc.gridheight=1將單元格縱向跨度改成了默認值1。這是因為我們在前面需要時將其改成了2,所以在此需要將其改回來。
實例說明
為了更好地理解這個強大的GridBagLayout布局管理器,我們再來做一個有趣的實驗。首先,我們創建一個testGridBag2.java
源程序:testGridBag2.java
import java.awt.*;
import javax.swing.*;
import java.applet.Applet;
public class testGridBag2 extends JApplet
{
public void init()
{
JPanel panel1=(JPanel)getContentPane();
panel1.setLayout(new GridBagLayout());
GridBagConstraints gbdc=new GridBagConstraints();
panel1.add(new JButton("No.1"),gbdc);
panel1.add(new JButton("No.2"),gbdc);
setSize(300,200);
}
}
然後我們使用滑鼠改變一下窗口的大小,看一下,這兩個按鈕有什麼變化?你會驚奇地發現,窗口改變了大小,兩個按鈕的大小卻沒有變,而且一直呆在正中央的位置。
一些說明:
在這個程序中,我們使用了一個以前沒有用過的語句:setsize(300.200),它的功能是在程序中設置窗口的大小。
現在我們對這個程序做一些修改!將添加兩個按鈕的兩條語句:
panel1.add(new JButton("No.1"),gbdc);
panel1.add(new JButton("No.2"),gbdc);
將它們擴展為:
gbdc.weightx=1;
panel1.add(new JButton("No.1"),gbdc);
gbdc.weightx=3;
panel1.add(new JButton("No.2"),gbdc);
為什麼會得到這個效果呢?我們在程序中添加按鈕的程序段前加入一句:
gbdc.fill=GridBagConstraints.HORIZONTAL;
再重新編譯一下程序,再看看程序的輸出有什麼變化!
在得到結果之前,自己可以想像一下結果,然後看一下程序的實際輸出與你的想法是否相吻合。
我們驚奇地發現,第二個按鈕,突然變得十分寬起來(如圖10-20所示)。這是因為放置第二個按鈕的單元格的寬度是3,而第一個按鈕的寬度是1。而且,我們又讓第二個按鈕橫向擴展,因此得到了這樣的輸出結果。
相信實驗做到這里,不須我說,大家也會有一些心得體會了。但是GridBagLayout遠不止這一點,大家應該多做試驗,才能夠在真實的使用環境中有效地掌握GridBagLayout。
⑵ JAVA中的JPanel怎麼使用呢
使用方法:
JPanel可以為添加到窗體中的輕型控制項提供通用的容器。默認情況下,面板容器不會向控制項添加任何除自身背景之外的顏色,但是,可以輕松地向其添加邊框(borders)並根據需要改制樣式。
在大多數Java GUI外觀體驗(look and feel)中,面板容器默認是不透明。不透明的面板容器跟普通的目錄窗格功能差別不大,並且可以有效幫助樣式改進。
設置圖層管理器
和其他容器(container)一樣,面板容器panel也使用布局管理器(Layout Manager)對添加到容器中的組件(compnent)進行定位和設置尺寸大小。
默認情況下,面板容器的布局管理器是FlowLayout(流式布局)類的一個實例,這個類對放置在容器中的空間按行進行布局(從左到右諸行排列)。在創建面板容器時,你可以輕松地使用任何其他
布局管理器通過調用setLayout方法或指定一個布局管理器。
如下是一個在創建面板容器時設置圖層管理器的例子:
JPanel p=new JPanel(new BorderLayout());
但這種方法不能用在BoxLayout(盒子布局)中,因為BoxLayout構造器需要一個預留(pre-existing)容器。如下所示:
JPanel p=new JPanel();
p.setLayout(new BoxLayout(p,BoxLayout.PAGE_AXIS));
添加控制項
向面板容器中添加組件時使用add()方法,而向add()方法中傳遞的參數決定於該面板容器使用哪個布局管理器。當所用的布局管理器是FlowLayout,BoxLayout,GridLayout,或SpringLayout時,像通常那樣向add()方法傳遞單一的參數即可,如下所示:
aFlowPanel.add(aComponent);
aFlowPanel.add(anotherComponent);
而當布局管理器為BorderLayout時,還需要提供另一個參數來指定添加到容器中控制項的位置,例如:
aBorderPanel.add(aComponent,BorderLayout.CENTER);
aBorderPanel.add(anotherComponent,BorderLayout.PAGE_END);
對於GridBagLayout布局管理器,可以使用上述任一方法,但必須以某種方式對每個組件指定GridBagConstraints,例如:
JPanel pane=new JPanel(new GridBagLayout());
GridBagConstraints c=new GridBagConstraints();
警告
Swing不是線程安全的。
此類的序列化對象與以後的Swing版本不兼容。當前序列化支持適用於短期存儲,或適用於在運行相同Swing版本的應用程序之間進行RMI(Remote Method Invocation,遠程方法調用)。
JPanel一個面板也是一個容器JPanel Pan=new JPanel();
Pan.setLayout(null);//設置為空布局也就是自由布局
Pan.add(控制項);//添加控制項
JPanel是java圖形化界面中最常使用的容器。實例:在窗體中添加一個藍色的面板
//PanelDemo.java
import javax.swing.*;
import java.awt.*;//引入AWT包,因為要使用到顏色類
class PanelDemo{
public static void main(String[]args)throws Exception
{JFrame f=new JFrame("第一個Java窗口");
f.setSize(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setLayout(null);//設置窗體布局為空布局
JPanel p=new JPanel();//實例化一個面板
//設置面板背景色為藍色,如果不引入AWT包,程序將出錯,可以試試看
p.setBackground(Color.BLUE);
p.setSize(100,100);//設置面板對象大小
f.getContentPane().add(p);//將面板添加到窗體中
//如果使用下面添加面板的方法,面板將布滿整個窗口,可以試試看
//f.setContentPane(p);
}
}
⑶ Java GUI中有哪幾種常用的布局方式,各有什麼特點
FlowLayout流式布局
BorderLayout邊界布局
GridLayout網格布局
CardLayout卡片布局
GridBagLayout網路包布局
布局?Java GUI布局吧?
AWT/Swing/SWT三種.
AWT 概述
Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。AWT 的主要優點是,它在 Java 技術的每個版本上都成為了一種標准配置,包括早期的 Web 瀏覽器中的 Java 實現;另外它也非常穩定。這意味著我們不需要單獨安裝這個工具包,在任何一個 Java 執行環境中都可以使用它,這一點正是我們所希望的特性。
AWT 是一個非常簡單的具有有限 GUI 元件、布局管理器和事件的工具包(參見 清單 1、清單 2 和 清單 3)。這是因為 Sun 公司決定為 AWT 使用一種最小公分母(LCD)的方法。因此它只會使用為所有 Java 主機環境定義的 GUI 元件。最終的結果非常不幸,有些經常使用的元件,例如表、樹、進度條等,都不支援。對於需要更多飢陪元件型別的應用程式來說,我們需要從頭開始建立這些元件。這是一個很大的負擔。
Swing 概述
Java Swing 是 Java Foundation Classes(JFC)的一部分,它是試圖解決 AWT 缺點的一個嘗試。在 Swing 中,Sun 開發了一個經爛渣蠢過仔細設計的、靈活而強大的 GUI 工具包。不幸的是,這意味著我們又要花一些時間來學習 Swing 了,對於常見的情況來說,Swing 有些太復雜了。
Swing 是在 AWT 元件基礎上構建的。所有 Swing 元件實際上也是 AWT 的一部分。Swing 使用了 AWT 的事件模型和支援類,例如 Colors、Images 和 Graphics。Swing 元件、布局管理器以及事件總結如下(參見 清單 4、清單 5 和 清單 6)。正如您可以看到的一樣,這些元件集比 AWT 提供的元件集更為廣泛,與 SWT 元件集相比也毫不遜色。
SWT 概述
與 AWT 的概念相比,SWT 是一個低階的 GUI 工具包。JFace 是一組用來簡化使用 SWT 構建 GUI 的增強元件和工具服務。SWT 的構建者從 AWT 和 Swing 實現中學習了很多經驗,他們試圖構建一個集二者優點於一體而沒有二者的缺點的系統。從很多方面來說,他們已經成功了。
SWT 也是基於一個對等體實現的,在這一點上它與 AWT 非常類似。它克服了 AWT 所面臨的 LCD 的問題,方法如下:定義了一組控制元件,它們可以用來構建大部分辦公應用程式或開發者工具,然後可以按照逐個主機的原則,為特定主機所沒有提供的控制元件建立模擬控制元件(這與 Swing 類似)。對於大部分現代主機來說,幾乎所有的控制元件都是基於本地對等體的。這意味著基於 SWT 的 GUI 既具有主機外觀,又具有主機的效能。這樣就避免了使用 AWT 和 Swing 而引起的大部分問題。特定的主機具有一些低階功能控制元件,因此 SWT 提供了擴充(通常是模擬的)版本(通常使用 「C」 作為名字中的第一個字母),從而可以產生更一致的行為。
發動機布局方式
前置前驅 一般中低轎車用 部分抵擋梁好跑車
前置後驅 一般中高檔轎車用 部分中低檔跑車
前置全驅 一般高階豪華車用 部分跑車
中置後驅 一般高檔高階豪華跑車用 F1
中置全驅 一般高檔高階豪華跑車用
後置後驅 一般大型客車用 保時捷高階高檔豪華跑車
後置全驅 保時捷高階高檔豪華跑車
發動機 排列方式
直列 L型 一般用於四缸發動機 少數六缸發動機 像寶馬
V型發動機 一般六缸以上發動機用
W型發動機 一般12缸以上發動機用 比如大眾途銳 奧迪A8 布加迪
H型發動機 一般跑車用 比如保時捷 斯巴魯
BorderLayout,
BoxLayout,
CardLayout,
DefaultMenuLayout,
FlowLayout,
GridBagLayout,
GridLayout,
GroupLayout
swing里常用的也有這些,至於每個具體的功能自己查一下API就可以了。
一、變極對數調速方法
這種調速方法是用改變定子繞組的接紅方式來改變籠型電動機定子極對數達到調速目的,特點如下:
1、具有較硬的機械特性,穩定性良好;
2、無轉差損耗,效率高;
3、接線簡單、控制方便、價格低;
4、有級調速,級差較大,不能獲得平滑調速;
5、可以與調壓調速、電磁轉差離合器配合使用,獲得較高效率的平滑調速特性。
本方法適用於不需要無級調速的生產機械,如金屬切削機床、升降機、起重裝置、風機、水泵等。
二、變頻調速方法
變頻調速是改變電動機定子電源的頻率,從而改變其同步轉速的調速方法。變頻調速系統主要裝置是提供變頻電源的變頻器,變頻器可分成交流-直流-交流變頻器和交流-交流變頻器兩大類,目前國內大都使用交-直-交變頻器。其特點:
1、效率高,調速過程中沒有附加損耗;
2、應用范圍廣,可用於籠型非同步電動機;
3、調速范圍大,特性硬,精度高;
4、技術復雜,造價高,維護檢修困難。
5、本方法適用於要求精度高、調速效能較好場合。
三、串級調速方法
串級調速是指繞線式電動機轉子迴路中串入可調節的附加電勢來改變電動機的轉差,達到調速的目的。大部分轉差功率被串入的附加電勢所吸收,再利用產生附加的裝置,把吸收的轉差功率返回電網或轉換能量加以利用。根據轉差功率吸收利用方式,串級調速可分為電機串級調速、機械串級調速及閘流體串級調速形式,多採用閘流體串級調速,其特點為:
1、可將調速過程中的轉差損耗回饋到電網或生產機械上,效率較高;
2、裝置容量與調速范圍成正比,投資省,適用於調速范圍在額定轉速70%-90%的生產機械上;
3、調速裝置故障時可以切換至全速執行,避免停產;
4、閘流體串級調速功率因數偏低,諧波影響較大。
5、本方法適合於風機、水泵及軋鋼機、礦井提升機、擠壓機上使用。
四、繞線式電動機轉子串電阻調速方法
繞線式非同步電動機轉子串入附加電阻,使電動機的轉差率加大,電動機在較低的轉速下執行。串入的電阻越大,電動機的轉速越低。此方法裝置簡單,控制方便,但轉差功率以發熱的形式消耗在電阻上。屬有級調速,機械特性較軟。
五、定子調壓調速方法
當改變電動機的定子電壓時,可以得到一組不同的機械特性曲線,從而獲得不同轉速。由於電動機的轉矩與電壓平方成正比,因此最大轉矩下降很多,其調速范圍較小,使一般籠型電動機難以應用。為了擴大調速范圍,調壓調速應採用轉子電阻值大的籠型電動機,如專供調壓調速用的力矩電動機,或者在繞線式電動機上串聯頻敏電阻。為了擴大穩定執行范圍,當調速在2:1以上的場合應採用反饋控制以達到自動調節轉速目的。
調壓調速的主要裝置是一個能提供電壓變化的電源,目前常用的調壓方式有串聯飽和電抗器、自耦變壓器以及閘流體調壓等幾種。閘流體調壓方式為最佳。調壓調速的特點:
1、調壓調速線路簡單,易實現自動控制;
2、調壓過程中轉差功率以發熱形式消耗在轉子電阻中,效率較低。
3、調壓調速一般適用於100KW以下的生產機械。
六、電磁調速電動機調速方法
電磁調速電動機由籠型電動機、電磁轉差離合器和直流勵磁電源(控制器)三部分組成。直流勵磁電源功率較小,通常由單相半波或全波閘流體整流器組成,改變閘流體的導通角,可以改變勵磁電流的大小。 電磁轉差離合器由電樞、磁極和勵磁繞組三部分組成。電樞和後者沒有機械聯絡,都能自由轉動。電樞與電動機轉子同軸聯接稱主動部分,由電動機帶動;磁極用聯軸節與負載軸對接稱從動部分。當電樞與磁極均為靜止時,如勵磁繞組通以直流,則沿氣隙圓周表面將形成若干對N、S極 *** 替的磁極,其磁通經過電樞。當電樞隨拖動電動機旋轉時,由於電樞與磁極間相對運動,因而使電樞感應產生渦流,此渦流與磁通相互作用產生轉矩,帶動有磁極的轉子按同一方向旋轉,但其轉速恆低於電樞的轉速N1,這是一種轉差調速方式,變動轉差離合器的直流勵磁電流,便可改變離合器的輸出轉矩和轉速。電磁調速電動機的調速特點:
1、裝置結構及控制線路簡單、執行可靠、維修方便;
2、調速平滑、無級調速;
3、對電網無諧影響;
4、速度失大、效率低。
5、本方法適用於中、小功率,要求平滑動、短時低速執行的生產機械。
七、液力耦合器調速方法
液力耦合器是一種液力傳動裝置,一般由泵輪和渦輪組成,它們統稱工作輪,放在密封殼體中。殼中充入一定量的工作液體,當泵輪在原動機帶動下旋轉時,處於其中的液體受葉片推動而旋轉,在離心力作用下沿著泵輪外環進入渦輪時,就在同一轉向上給渦輪葉片以推力,使其帶動生產機械運轉。液力耦合器的動力轉輸能力與殼內相對充液量的大小是一致的。在工作過程中,改變充液率就可以改變耦合器的渦輪轉速,作到無級調速,其特點為:
1、功率適應范圍大,可滿足從幾十千瓦至數千千瓦不同功率的需要;
2、結構簡單,工作可靠,使用及維修方便,且造價低;
3、尺寸小,能容大;
4、控制調節方便,容易實現自動控制。
5、本方法適用於風機、水泵的調速。
⑴、水平布置:將裝置和元件按行布置,使得其連線線一般成水平布置。
⑵、垂直布置:將裝置或元件按列排列,連線線成垂直布置。
⑶、交叉布置:將相應的元件連線成對稱的布局。
電話撥號接入
傳輸介質 : 電話線終端
上行速率 : 512k—640k
下行數率 : 512k-1M
價格水平 : 非常便宜(48元包月)
適用場合 : 個人
穩定性 : 非常不穩定
提供商 : 中國移動、中國聯通
ISDN撥號
傳輸介質 :網路水晶線
上行速率 :640k-2M
下行數率 :1M-2M
價格水平 :便宜(70元左右)
適用場合 :對網路要求不高的個人
穩定性 :趨於穩定
提供商 :中國網通、中國電信、中國鐵通
租用線路(DDN專線接入)
傳輸介質 : MODEM
上行速率 : 1M-10M
下行數率 : 640k
價格水平 : 偏貴(80元包月左右)
適用場合 : 公司、個人上網
穩定性 : 非常穩定
提供商 : 中國鐵通
區域網接入
傳輸介質 : 伺服器
上行速率 : 512k-1M
下行數率 : 640k-2M
價格水平 : 偏貴(90元左右)
適用場合 : 辦公室
穩定性 : 不太穩定
提供商 : 中國移動、中國聯通、中國網通、中國電信
無線接入
傳輸介質 :無線網路卡
上行速率 :1M-5M
下行數率 :512k-1M
價格水平 :貴(120元左右包月)
適用場合 :經常出差或者旅遊的個人
穩定性 : 不穩定
提供商 : 暫無
Cable Modem接入
傳輸介質 :MODEM服務端
上行速率 :10M
下行數率 :1M
價格水平 :便宜
適用場合 :公司、家庭
穩定性 :非常穩定
提供商 :中國網通、中國電信、中國移動、中國聯通
光纖接入
傳輸介質 :光纖電纜
上行速率 :10M-100M
下行數率 :10M
價格水平 :非常貴
適用場合 :IDC/對網路要求極高的人群等穩定性 :最穩定了
提供商 :美國、日本提供商
換流就是電流從一條支路換向另一支路的過程.
換流方式有4種.
器件換流,利用全控器件的自關斷能力進行換流.全控型器件採用此換流方式.
電網換流,由電網提供換流電壓,只要把負的電網電壓加到欲關斷的器件上即可.
負載換流,由負載提供換流電壓,當負載為電容性負載即負載電流超前於負載電壓時,可實現負載換流.
強迫換流,設定附加換流電路,給欲關斷的閘流體施加反向電壓換流稱為強迫換流.通常是利用附加電容上的能量實現的,也稱電容換流.