7.2 Swing組件和容器
在Swing中不但用輕量級(jí)的組件替代了AWT中的重量級(jí)的組件,而且Swing的替代組件中都包含有一些其他的特性。例如,Swing的按鈕和標(biāo)簽可顯示圖標(biāo)和文本,而AWT的按鈕和標(biāo)簽只能顯示文本。Swing中的大多數(shù)組件都是AWT組件名前面加了一個(gè)"J"。
7.2.1 組件的分類
Jcomponent是一個(gè)抽象類,用于定義所有子類組件的一般方法,其類層次結(jié)構(gòu)如下所示:
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
并不是所有的Swing組件都繼承于JComponent類,JComponent類繼承于Container類,所以凡是此類的組件都可作為容器使用。
組件從功能上分可分為:
1) 頂層容器:JFrame,JApplet,JDialog,JWindow共4個(gè)
2) 中間容器:JPanel,JScrollPane,JSplitPane,JToolBar
3) 特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame,JLayeredPane,JRootPane.
4) 基本控件:實(shí)現(xiàn)人際交互的組件,如Jbutton, JComboBox, JList, JMenu, JSlider, JtextField。
5) 不可編輯信息的顯示:向用戶顯示不可編輯信息的組件,例如JLabel, JProgressBar, ToolTip。
6) 可編輯信息的顯示:向用戶顯示能被編輯的格式化信息的組件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。
JComponent類的特殊功能又分為:
1) 邊框設(shè)置:使用setBorder()方法可以設(shè)置組件外圍的邊框,使用一個(gè)EmptyBorder對(duì)象能在組件周圍留出空白。
2) 雙緩沖區(qū):使用雙緩沖技術(shù)能改進(jìn)頻繁變化的組件的顯示效果。與AWT組件不同,JComponent組件默認(rèn)雙緩沖區(qū),不必自己重寫代碼。如果想關(guān)閉雙緩沖區(qū),可以在組件上施加setDoubleBuffered(false)方法。
3) 提示信息:使用setTooltipText()方法,為組件設(shè)置對(duì)用戶有幫助的提示信息。
4) 鍵盤導(dǎo)航:使用registerKeyboardAction( ) 方法,能使用戶用鍵盤代替鼠標(biāo)來驅(qū)動(dòng)組件。JComponent類的子類AbstractButton還提供了便利的方法--用setMnemonic( )方法指明一個(gè)字符,通過這個(gè)字符和一個(gè)當(dāng)前L&F的特殊修飾共同激活按鈕動(dòng)作。
5) 可插入L&F:每個(gè)Jcomponent對(duì)象有一個(gè)相應(yīng)的ComponentUI對(duì)象,為它完成所有的繪畫、事件處理、決定尺寸大小等工作。 ComponentUI對(duì)象依賴當(dāng)前使用的L&F,用UIManager.setLookAndFeel( )方法可以設(shè)置需要的L&F.
6) 支持布局:通過設(shè)置組件、最小、推薦尺寸的方法和設(shè)置X、Y對(duì)齊參數(shù)值的方法能指定布局管理器的約束條件,為布局提供支持。
7.2.2 使用Swing的基本規(guī)則
與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(content pane)上。內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件。基本規(guī)則如下:
(1)把Swing組件放入一個(gè)頂層Swing容器的內(nèi)容面板上
(2)避免使用非Swing的重量級(jí)組件。
看圖
對(duì)JFrame添加組件有兩種方式:
1) 用getContentPane( )方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件:frame.getContentPane().add(childComponent)
2) 建立一個(gè)Jpanel或 JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:
Jpanel contentPane=new Jpanel( );
……//把其它組件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane對(duì)象設(shè)置成為frame的內(nèi)容面板
在Swing中不但用輕量級(jí)的組件替代了AWT中的重量級(jí)的組件,而且Swing的替代組件中都包含有一些其他的特性。例如,Swing的按鈕和標(biāo)簽可顯示圖標(biāo)和文本,而AWT的按鈕和標(biāo)簽只能顯示文本。Swing中的大多數(shù)組件都是AWT組件名前面加了一個(gè)"J"。
7.2.1 組件的分類
Jcomponent是一個(gè)抽象類,用于定義所有子類組件的一般方法,其類層次結(jié)構(gòu)如下所示:
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
并不是所有的Swing組件都繼承于JComponent類,JComponent類繼承于Container類,所以凡是此類的組件都可作為容器使用。
組件從功能上分可分為:
1) 頂層容器:JFrame,JApplet,JDialog,JWindow共4個(gè)
2) 中間容器:JPanel,JScrollPane,JSplitPane,JToolBar
3) 特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame,JLayeredPane,JRootPane.
4) 基本控件:實(shí)現(xiàn)人際交互的組件,如Jbutton, JComboBox, JList, JMenu, JSlider, JtextField。
5) 不可編輯信息的顯示:向用戶顯示不可編輯信息的組件,例如JLabel, JProgressBar, ToolTip。
6) 可編輯信息的顯示:向用戶顯示能被編輯的格式化信息的組件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。
JComponent類的特殊功能又分為:
1) 邊框設(shè)置:使用setBorder()方法可以設(shè)置組件外圍的邊框,使用一個(gè)EmptyBorder對(duì)象能在組件周圍留出空白。
2) 雙緩沖區(qū):使用雙緩沖技術(shù)能改進(jìn)頻繁變化的組件的顯示效果。與AWT組件不同,JComponent組件默認(rèn)雙緩沖區(qū),不必自己重寫代碼。如果想關(guān)閉雙緩沖區(qū),可以在組件上施加setDoubleBuffered(false)方法。
3) 提示信息:使用setTooltipText()方法,為組件設(shè)置對(duì)用戶有幫助的提示信息。
4) 鍵盤導(dǎo)航:使用registerKeyboardAction( ) 方法,能使用戶用鍵盤代替鼠標(biāo)來驅(qū)動(dòng)組件。JComponent類的子類AbstractButton還提供了便利的方法--用setMnemonic( )方法指明一個(gè)字符,通過這個(gè)字符和一個(gè)當(dāng)前L&F的特殊修飾共同激活按鈕動(dòng)作。
5) 可插入L&F:每個(gè)Jcomponent對(duì)象有一個(gè)相應(yīng)的ComponentUI對(duì)象,為它完成所有的繪畫、事件處理、決定尺寸大小等工作。 ComponentUI對(duì)象依賴當(dāng)前使用的L&F,用UIManager.setLookAndFeel( )方法可以設(shè)置需要的L&F.
6) 支持布局:通過設(shè)置組件、最小、推薦尺寸的方法和設(shè)置X、Y對(duì)齊參數(shù)值的方法能指定布局管理器的約束條件,為布局提供支持。
7.2.2 使用Swing的基本規(guī)則
與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(content pane)上。內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件。基本規(guī)則如下:
(1)把Swing組件放入一個(gè)頂層Swing容器的內(nèi)容面板上
(2)避免使用非Swing的重量級(jí)組件。
看圖
對(duì)JFrame添加組件有兩種方式:
1) 用getContentPane( )方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件:frame.getContentPane().add(childComponent)
2) 建立一個(gè)Jpanel或 JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:
Jpanel contentPane=new Jpanel( );
……//把其它組件添加到Jpanel中;
frame.setContentPane(contentPane);
//把contentPane對(duì)象設(shè)置成為frame的內(nèi)容面板