? ++ Swing讀書筆記
1-1:Swing常用的package
??????????? PACHAGE? |????????????
???????? 內????????? 容
?????????
-----------------|--------------------
-----------
?????????? javax.swing????????????????????? |????????
最常用的pachage,包含了各種swing組件的類
?????????? javax.swing.border?????????????? |????????
包含與swing組件外框有關的類
?????????? javax..swing.colorchooser??????? |????????
針對swing調色盤組件(JColorChooser)所設計的類
?????????? javax.swing.event??????????????? |????????
處理由swing組件產生的事件,有別于AWT事件
?????????? javax.swing.filechooser????????? |????????
包含針對swing文件選擇對話框(JFileChooser)所設計的類
????????? ---------------------------------
-------------
?????????? javax.swing.plaf???????????????? |????????
處理swing組件外觀的相關類
?????????? javax.swing.plaf.basic?????????? |????????
?????????? javax.swing.plaf.metal?????????? |????????
?????????? javax.swing.plaf.multi?????????? |?
?????????? ---------------------------------
-------------
??????
?????????? javax.swing.table??????????????? |????????
針對swing表格組件(JTable)所設計的類
?????????? ---------------------------------
-------------
?????????? javax.swing.text???????????????? |????????
包含與swing文字組件相關的類
?????????? javax.swing.text.html??????????? |
?????????? javax.swing.text.html.parser???? |
?????????? javax.swing.text.rtf???????????? |
?????????? ---------------------------------
-------------
?????????? javax.swing.tree???????????????? |????????
針對swing樹關元件(JTree)所設計的類
?????????? javax.swing.undo???????????????? |????????
提供swing文字組件Redo或Undo的功能
1-2:swing的版面結構
?? Swing中幾乎所有組件都是從JComponent衍生而來,也就是說這些組件都是
lightweight
Component,均由純java code所編寫面成
、Swing中以下幾個組件不是由JComponent繼承面來:
??? JFrame(JRoot Pane)
??? JDialog(JRoot Pane)
??? JWindow(JRoot Pane)
??? JApplet(JRoot Pane)
? 以上四個組件是heavyweight Component,必須使用到native
code來畫出這四個窗口組件,因為要在操作系統中顯示窗口畫面,必
須使用操作系統的宣傳品資源,面以往的AWT組件大多使用native
code所構造出來,因此Swing中的JFrame便繼承原有AWT中的Frame
類,面不是繼承JComponent類。同樣,JApplet是繼承原有AWT中的JApplet類,也不是
繼承JComponent類。
???
JFrame、JDialog、JWindow及JApplet這四個組件統稱為最上層組件,因為其余的swing
組件都必須依附在此四組件之一上才能
顯示出來。此四組件均實現(Implement)RootPaneContainer這個界面(Interface),此界
面定義了各種容器取得與設置并不是真實的容器,它是由Glass
Pane與Layered Pane所組成(Layered Pane里擁有Content Pane與Menu
Bar,而Menu Bar可選擇使用或不使用),
我們不能在JRootPane上加入任何的組件,因為它只是一個虛擬的容器,若要在最上層
組件上加入組件,必須加在Layered
Pane或是
Layered Pane里的Content
Pane上。以JFrame為例,一般我們要在JFrame上加入其他組件(如JButton、JLabel等)
必須先取得JFrame
的Content Pane,然后將要加入的組件放在此Content
Pane中,而不是直接就加到JFrame上。因此若要在JFrame中加入一個按鈕,不
能像以前AWT時一樣寫成frame.add(button)的形式,而必須先取得JFrame的Content
Pane,然后將按鈕加入Content Pane中,如:
?? frame.getContentPane().add(button)
否則在編譯的時候將有錯誤信息產生。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&
注意:
1.組件必須加在容器中,而容器本身具有層次性的關系,就如同珠寶盒一般,大盒子里
面可以放小盒子,小盒子里面還可以放更小的盒子,而珠寶就可以放在某一個盒子中,
這里的珠寶就代表組件,盒子就代表容器。因此若您想在JFrame加入任何組件時,必須
先取得JFrame的容器來放置這些組件,而由于JFrame、JDialog、JWindow與JApplet是
顯示Swing組件的源頭,我們可以稱它們為根
組件,也就是所謂的最上層組件。
2.RootPaneContainer它是一個interface,共有5個類實現(Implement)它,分別是
JFrame、JAppleet、JWindow、JDialog、
JInternalFrame,其中JInternalFrame是一個lightweight
Component,它不是一個最上層組件,也就是說JInternalFrame不能單獨顯示出來,必須
依附在最上層組件中,我們將在下面討論組件,而JFrame,JApplet,JWindow,JDialog均
為最上層組件。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&
RootPaneContainer定義了下面幾種方法:
??? 方法
? Container?????? getContentPane()返回contentPane
? Component?????? getGlassPane()返回glassPane
? JLayeredPane??? getLayeredPane()返回layeredPane
? JRootPane?????? getRootPane返回屬于這個組件的JRootPane
? Void??????????? setContentPane(Container
contentpane)設置ContentPane
? Void??????????? setGlassPane(Component
glassPane)設置GlassPane
? Void??????????? setLayeredPane(JLayeredPane
layeredPane)設置LayeredPane
JFrame如何取得Content Pane的實際流程,下面是一段很簡單的程序代碼:
? public class Simple{
??? Simple(){
?????? JFrame frame=new JFrame();
?????? Container contentPane=frame.getContentPane();
?????? JButton button=new JButton();
?????? contentPane.add(button);
??? }
? }
當我們寫frame.getContentPane()時,會返回此frame的Content
Pane,也就是一個容器組件,有了容器之后我們才能將button組件
擺進去,此時JFrame才算擁有button組件。所以JFrame就好像是一塊空地,要在這空地
上信人應該先蓋一棟房子(容器),然后人
、家具、設備等等(組件)就能搬進此房子中。下面的層次結構說明了最上層組件都含
有JRootPane組件,JRootPane本身就含有容
器組件,可讓最上層組件裝入其他的組件。
????? |Frame------JFrame(JRoot Pane)
????? |
Window|Dialog-----JDialog(JRoot Pane)
????? |
????? |
????? |-----------JWindow(JRoot Pane)
Applet -----------JApplet(JRoot Pane)
圖示:
???????? |Grass Pane
???????? |
Root Pane|
???????? |??????????? |Content Pane
???????? |Layered Pane|
????????????????????? |Menu Bar
1-3:版面管理器(Layout Menager)
???????? |BorderLayout
???????? |FlowLayout
???????? |GridLayout
? AWT----|CardLayout
???????? |GridBagLayout
? Swing--|BoxLayout
1-3-1:BorderLayout的使用:
?? BorderLayout的類層次結構圖:
?????? java.lang.Object
??????? --java.awt.BorderLayout
?? 構造函數:BorderLayout()建立一個沒有間距的border layout
???????????? BorderLayout(int hgap,int
vgap)建立一個組件間有間距的border layout
? BorderLayout將版面劃分為東、西、南、北、中
例子:BorderLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BorderLayoutDemo{
?? public BorderLayoutDemo(){
???? JFrame f=new JFrame();
??????? Container contentPane=f.getContentPane();
??????? contentPane.setLayout(new BorderLayout());
??????? contentPane.add(new
JButton("EAST"),BorderLayout.EAST);
??????? contentPane.add(new
JButton("WEST"),BorderLayout.WEST);
??????? contentPane.add(new
JButton("SOUTH"),BorderLayout.SOUTH);
??????? contentPane.add(new
JButton("NORTH"),BorderLayout.NORTH);
??????? contentPane.add(new
JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER);
??????? f.setTitle("BorderLayout");
??????? f.pack();
??????? f.setVisible(true);
??????? /***read**/
??????? /*處理關閉窗口的操作,若你沒寫這一段,就算你已經關閉窗口了,但程序并
不會終止。
???????? */
??????? f.addWindowListener(
?????????? new WindowAdapter(){
?????????????? public void windowClosing(WindowEvent e){
????????????????? System.exit(0);
?????????????? }
?????????? }
??????? );
?????? /***read**/
?? }
?? public static void main(String[] args){
???? BorderLayoutDemo b=new BorderLayoutDemo();
?? }
}
??
設置組件的間距,你可以使用有間距參數的BorderLayout構造函數,也可以利用
BorderLayout的setHgap(int
hgap)與
?? setVgap(int vgap)兩個方法來達成。
1-3-2:FlowLayout的使用:
?? FlowLayout的類層次結構圖:
?????? java.lang.Object
??????? --java.awt.FlowLayout
?? 構造函數:FlowLayout()建立一個新的Flow
Layout,此FlowLayout默認值是居中對齊,組件彼此有5單位的水平與垂直間距。
???????????? FlowLayout(int align)建立一個新的Flow
Layout,此FlowLayout可設置排列方式,組件彼此有5單位的水平與垂直
????????? 間距。
???????????? FlowLayout(int align,int hgap,int
vgap)建立一個新的Flow Layout,此FlowLayout可設置排列方式與組件間距。
FlowLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FlowLayoutDemo{
?? public FlowLayoutDemo(){
??? JFrame f=new JFrame();
?????? Container contentPane=f.getContentPane();
?????? /*你可以使用有間距的FlowLayout構造函數,使FlowLayout的排列具有間距,并
??????? *并可利用排列方向參數來指定靠什么方向排列,FlowLayout共有五種排列方
式,
???????
*依次是CENTER(默認值),LEFT,RIGHT,LEADING,TRAILING,若我們將下面程序第13
??????? *行改成contentPane.setLayout(new
FlowLayout(FlowLayout.LEFT));
??????? */
?????? contentPane.setLayout(new FlowLayout());??????
?????? contentPane.add(new JButton("first"));
?????? contentPane.add(new JButton("second"));
?????? contentPane.add(new JButton("third"));
?????? contentPane.add(new JButton("fourth"));
?????? contentPane.add(new JButton("fifth"));
?????? contentPane.add(new JButton("Last"));
??????
?????? f.setTitle("FlowLayout");
?????? file://f.pack();//必須將f.pach()去掉,否則setSize功能將沒有作用
?????? f.setSize(400,220);
?????? f.setVisible(true);
??????? f.addWindowListener(
?????????? new WindowAdapter(){
?????????????? public void windowClosing(WindowEvent e){
????????????????? System.exit(0);
?????????????? }
?????????? }
??????? );
?? }
?? public static void main(String[] args){
???? FlowLayoutDemo b=new FlowLayoutDemo();
?? }
}
1-3-3:GridLayout的使用:
?????? GridLayout的類層次結構圖:
?????? java.lang.Object
??????? --java.awt.GridLayout
???
GridLayout比FlowLayout多了行和列的設置,也就是說你要先設置GridLayout共有幾行
幾列,就如同二維平面一般,然后你加
進去的組件會先填第一行的格子,然后再從第二行開始填,依此類扒,就像是一個個的
格子一般。而且GridLayout會將所填進去組
件的大小設為一樣。
構造函數:GridLayout()建立一個新的GridLayout,默認值是1行1列。
????????? GridLayout(int rows,int
cols)建立一個幾行幾列的GridLayout.
????????? GridLayout(int rows,int cols, int hgap,int
vgap)建立一個幾行幾列的GridLayout,并設置組件的間距。
例子:GridLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardLayoutDemo implements ActionListener{
? JPanel p1,p2,p3,p4;
? int i=1;
? JFrame f;
? public CardLayoutDemo(){
??? f=new JFrame();//當做top-level組件
????? Container contentPane=f.getContentPane();
????? contentPane.setLayout(new GridLayout(2,1));
?????
????? p1=new JPanel();
????? Button b=new Button("Change Card");
????? b.addActionListener(this);//當按下"Change
Card"時,進行事件監聽,將會有系統操作產生。
????? p1.add(b);??????????????? file://處理操作在52-64行.
????? contentPane.add(p1);
?????
????? p2=new JPanel();
????? p2.setLayout(new FlowLayout());
????? p2.add(new JButton("first"));
????? p2.add(new JButton("second"));
????? p2.add(new JButton("third"));
?????
????? p3=new JPanel();
????? p3.setLayout(new GridLayout(3,1));
????? p3.add(new JButton("fourth"));
????? p3.add(new JButton("fifth"));
????? p3.add(new JButton("This is the last button"));
?????
????? p4=new JPanel();
????? p4.setLayout(new CardLayout());
????? p4.add("one",p2);
????? p4.add("two",p3);
????? /*要顯示CardLayout的卡片,除了用show(Container parent,String
name)這個方法外
??????
*,也可試試first(Container),next(Container),previous(Container),last
(Container)這
?????? *四個方法,一樣可以達到顯示效果。
?????? */
????? ((CardLayout)p4.getLayout()).show(p4,"one");
?????
????? contentPane.add(p4);
?????
????? f.setTitle("CardLayout");
????? f.pack();
????? f.setVisible(true);
?????
????? f.addWindowListener(
?????????? new WindowAdapter(){
?????????????? public void windowClosing(WindowEvent e){
????????????????? System.exit(0);
?????????????? }
?????????? }
????? );
?????
? }
? public void actionPerformed(ActionEvent event){
???? switch(i){
??????? case 1:
???????????? ((CardLayout)p4.getLayout()).show(p4,"two");
???????????? break;
??????? case 2:
???????????? ((CardLayout)p4.getLayout()).show(p4,"one");
???????????? break;
???? }
???? i++;
???? if (i==3) i=1;
???? f.validate();
? }
? public static void main(String[] args){
?? new CardLayoutDemo();
? }
}
1-3-5:GridBagLayout的使用:是java中最有彈性但也是最復雜的一種版面管理器。它
只有一種構造函數,但必須配合
??? GridBagConstraints才能達到設置的效果。
??? GridBagLayout的類層次結構圖:
??? java.lang.Object
???? --java.awt.GridBagLayout
構造函數:
??? GirdBagLayout()建立一個新的GridBagLayout管理器。
??? GridBagConstraints()建立一個新的GridBagConstraints對象。
??? GridBagConstraints(int gridx,int gridy,int
gridwidth,int gridheight,double weightx,double weighty,
?????????????????????? int anchor,int fill, Insets
insets,int ipadx,int ipady)建立一個新的GridBagConstraints對象
????????????????????? ,并指定其參數的值。
參數說明:
gridx,gridy:設置組件的位置,gridx設置為GridBagConstraints.RELATIVE代表此組件
位于之前所加入組件的右邊。
????????????
若將gridy設置為GridBagConstraints.RELATIVE代表此組件位于以前所加入組件的下
面。建議定義出
????????????
gridx,gridy的位置,以便以后維護程序。表示放在幾行幾列,gridx=0,gridy=0時放在
0行0列。
gridwidth,gridheight:用來設置組件所占的單位長度與高度,默認值皆為1。你可以使
用GridBagConstraints.REMAINDER常
????????????????????? 量,代表此組件為此行或此列的最后一個組件,而且會占據所
有剩余的空間。
weightx,weighty:用來設置窗口變大時,各組件跟著變大的比例,當數字越大,表示組
件能得到更多的空間,默認值皆為0。
anchor:????????
當組件空間大于組件本身時,要將組件置于何處,有CENTER(默認值)、NORTH、
NORTHEAST、EAST、SOUTHEAST、
???????????????? WEST、NORTHWEST可供選擇。
insets:設置組件之間彼此的間距,它有四個參數,分別是上,左,下,右,默認為
(0,0,0,0).
ipadx,ipady:設置組件內的間距,默認值為0。?????????????
??
我們以前提過,GridBagLayout里的各種設置都必須通過GridBagConstraints,因此當我
們將GridBagConstraints的參數都設置
好了之后,必須new一個GridBagConstraints的對象出來,以便GridBagLayout使用。
例子:
GridBagLayoutDemo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridBagLayoutDemo{
?? public GridBagLayoutDemo(){
??? JButton b;
??? GridBagConstraints c;
??? int
gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;
??? double weightx,weighty;
??? Insets inset;
???
??? JFrame f=new JFrame();
??? GridBagLayout gridbag=new GridBagLayout();
????? Container contentPane=f.getContentPane();
????? contentPane.setLayout(gridbag);
?????
????? b=new JButton("first");
????? gridx=0;
????? gridy=0;
????? gridwidth=1;
????? gridheight=1;
????? weightx=10;
????? weighty=1;
????? anchor=GridBagConstraints.CENTER;
????? fill=GridBagConstraints.HORIZONTAL;
????? inset=new Insets(0,0,0,0);
????? ipadx=0;
????? ipady=0;
????? c=new
GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
???????? fill,inset,ipadx,ipady);
????? gridbag.setConstraints(b,c);
????? contentPane.add(b);
?????
?????
????? b=new JButton("second");
????? gridx=1;
????? gridy=0;
????? gridwidth=2;
????? gridheight=1;
????? weightx=1;
????? weighty=1;
????? anchor=GridBagConstraints.CENTER;
????? fill=GridBagConstraints.HORIZONTAL;
????? inset=new Insets(0,0,0,0);
????? ipadx=50;
????? ipady=0;
????? c=new
GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
???????? fill,inset,ipadx,ipady);
????? gridbag.setConstraints(b,c);
????? contentPane.add(b);
????? b=new JButton("third");
????? gridx=0;
????? gridy=1;
????? gridwidth=1;
????? gridheight=1;
????? weightx=1;
????? weighty=1;
????? anchor=GridBagConstraints.CENTER;
????? fill=GridBagConstraints.HORIZONTAL;
????? inset=new Insets(0,0,0,0);
????? ipadx=0;
????? ipady=50;
????? c=new
GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
???????? fill,inset,ipadx,ipady);
????? gridbag.setConstraints(b,c);
????? contentPane.add(b);
?????
????? b=new JButton("fourth");
????? gridx=1;
????? gridy=1;
????? gridwidth=1;
????? gridheight=1;
????? weightx=1;
????? weighty=1;
????? anchor=GridBagConstraints.CENTER;
????? fill=GridBagConstraints.HORIZONTAL;
????? inset=new Insets(0,0,0,0);
????? ipadx=0;
????? ipady=0;
????? c=new
GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
???????? fill,inset,ipadx,ipady);
????? gridbag.setConstraints(b,c);
????? contentPane.add(b);
????? b=new JButton("This is the last button");
????? gridx=2;
????? gridy=1;
????? gridwidth=1;
????? gridheight=2;
????? weightx=1;
????? weighty=1;
????? anchor=GridBagConstraints.CENTER;
????? fill=GridBagConstraints.HORIZONTAL;
????? inset=new Insets(0,0,0,0);
????? ipadx=0;
????? ipady=50;
????? c=new
GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
???????? fill,inset,ipadx,ipady);
????? gridbag.setConstraints(b,c);
????? contentPane.add(b);
????? f.setTitle("GridBagLayout");
????? f.pack();
????? f.setVisible(true);
????? f.addWindowListener(
?????????? new WindowAdapter(){
?????????????? public void windowClosing(WindowEvent e){
????????????????? System.exit(0);
?????????????? }
?????????? }
????? );?????
?? }
?? public static void main(String[] args){
??? new GridBagLayoutDemo();
?? }
}?
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1575135