Swing它采取100%java實現(xiàn) 不在依賴本地平臺,所有平臺都可以保持相同的運行效果,對跨平臺支持比較出色 實現(xiàn)了MVC設(shè)計模式也稱為Model-Delegate(模式-代理)
獨立于本地平臺的Swing(速度慢點)組件被稱為輕量級組件,而依賴本地平臺的AWT組件被稱為重量級組件
大部份Swing組件都是JComponent抽象類的直接或間接子類,JComponent類繼承了java.atw.Containter類,所以Swing組件類可作為容器使用
Swing中包括了4個組件直接繼承了AWT組件,而不是從JComponent派生,JFrame JWindows
JDialog JApplet 他們其實不是輕量級組件,而是重量級組件(需要拜托給GUI組件的平臺)
Swing組件按功能來分,又可以分為幾類
1. 頂層容器 :JFrame JWindows JDialog JApplet
2. 中間容器 :JPanel JScrollPane JSplitane JTooLBar
3. 特殊容器 : 在用戶界面上具有特殊作用的中間容器 如 JInternalFrame JRootPane
4. 基本組件 : 實現(xiàn)人機交互的組件 JButton JMenu
5. 不可編輯信息的顯示組件 :向用戶顯示不可以編輯的組件信息 JLable
6. 可編輯信息的顯示組件 : 向用戶顯示被編輯的格式化信息的組件 JTable JTextArea
7. 特殊對話框組件 如JColorChooser 和JFileChooser
相對AWT組件 Swing組件具有以下4個功能
1.可以為Swing組件設(shè)置提示信息
2.很多Swing組件如 按鈕 標簽 菜單等 除使用文字外,還可使用圖標標示自己
3.支持插拔式的外觀風(fēng)格
4.支持設(shè)置邊框
AWT菜單對象在創(chuàng)建快捷鍵時,直接傳入KeyShortcut對象為其制定快捷鍵,但Swing菜單項制定快捷鍵必須通過setAccelerator(KeyStroke ks)方法來設(shè)定
SwingUtilities 類的updateComponentTreeUI()方法類跟新制定容器的注意的是跟新的是JFrame對象getContentPanel()方法的返回值,而不是直接跟新JFrame JFrame仍然依賴于本地平臺的圖象組件
JScrollPane對JTable組件特別重要,通常需要把JTable放在JScrollPane容器中才可以顯示出JTable組件的標題欄
可以調(diào)用JComponent提供的setBorder(Border b)方法為Swing組件設(shè)置邊框,其中Border是Swing的接口
TitledBorder 和Component 比較獨特,其中TitleBorder的作用是為其他邊框設(shè)計標題,當創(chuàng)建1個TitledBorder對象時,就需要傳入1個已存在的Border對象,因此每創(chuàng)建1個ComponentBorder對象時都需要傳入兩個Border對象,1個用作組件的內(nèi)邊框,1個用于組件的外邊框
Swing組件添加邊框的步驟以下
1.使用BorderFactor或XxxBorder創(chuàng)建XxxBorder實例
2.調(diào)用Swing組件的setBorder(Border b)方法為該組件設(shè)置邊框
Swing 組件還有兩個功能
1. 所有的Swing組件默許啟用雙緩存繪圖技術(shù)(避免頻沉重繪GUI組件時顯示閃爍現(xiàn)象)默許開啟
2. 所有的Swing組件都提供了簡單的鍵盤驅(qū)動 JComponent類提供了getInputMap() 返回1個InputMap對象,該對象用于將KeyStroke對象和名字關(guān)聯(lián);getActionMap()返回1個ActionMap對象 用于將制定名字和Action關(guān)聯(lián),從而可以允許用戶通過鍵盤來操作代替鼠標驅(qū)動GUI上的Swing組件 (相當于提供快捷鍵)
Swing提供了JToolBar來創(chuàng)建工具條,創(chuàng)建JToolBar對象時可以制定以下兩個參數(shù)
name :該參數(shù)為工具條的名稱
orientation : 該參數(shù)表示工具條的方向
Action接口是ActionListener接口的子接口,處理提供actionPerformed()方法以外,還包括 name 和 icon 不但可以作為事件監(jiān)聽器使用,還可以轉(zhuǎn)換為按鈕或菜單項
Action本身不是按鈕也不是菜單項,只有當把Action對象添加當某些組件(也能夠直接使用Action來創(chuàng)建)也就是說 這些容器需要負責完成以下的事
1.創(chuàng)建1個試用與該容器的組件
2.從Action對象的初始化中取得對的屬性來設(shè)置組件
3.檢查Action對象的初始化 肯定它是不是是激活狀態(tài)
4.通過Action對象為對應(yīng)組件注冊事件監(jiān)聽器
JFileChooser用于創(chuàng)建色彩的對話框 該方法提供了兩個靜態(tài)方法
showDialog(Componment c ,Stting title ,Color col)大部份時候時用來讓用戶選擇色彩
createDialog(Component c ,String tilte ,boolean modal ,JColorChoose jc ,ActionListener listerner ,ActionListenenr cann)
JFileChooser的功能與AWT中的FileDialog基本相似,也就是生成“打開文件”,“保存文件”對話框
為了調(diào)用JFileChooser來打開1個文件對話框,必須下創(chuàng)建該對話框的實例,JFileChooser提供了多個構(gòu)造器來創(chuàng)建JFileChooser對象
JFileChooser 調(diào)用showXxxDialog()方法來顯示文件對話框,
使用JFileChooser來創(chuàng)建文件對話框運行用戶選擇文件的步驟以下
1. 采取構(gòu)造器創(chuàng)建1個JFileChooser對象,該JFileChooser對象無需指定parent組件,所有可以在多個組件之間共有JFileChooser對象
2. 調(diào)用JFileChooser的1系列可選方法對JFileChooser履行操作
3. 如果讓文件對話框?qū)崿F(xiàn)文件過濾功能,則需要結(jié)合FileFilter類來進行文件過濾
4. 如果需要改變文件對話框的視圖外觀,則可以結(jié)合FileView類來改變對話框中文件的視圖外觀
5. 調(diào)用showXxxDialog 方法可以打開文件對話框
6. JFileChooser提供了兩個方法來獲得用戶選擇文件或文件集
通過JOptionPane可以非常方便的創(chuàng)建1些簡單的對話框,Swing已為這些對話框添加了相應(yīng)的組件,無需程序員手動添加組件
JOptionPane提供了4個方法來創(chuàng)建對話框
1. showMessageDialog/showInternalMessageDialog 消息對話框,用戶只能點肯定(類似js alert)
2. showConfirmDialog/showInternalComfirmDialog 肯定對話框 想用戶肯定某1個問題 用戶可以選擇yes no canel 等 (類似JS 的 comfirm)
3. showInputDialog/showInternalInputDialog 輸入對話框,提示要求輸入某些信息,類似于JS的prompt函數(shù) 改方法返回用戶輸入的字符串
4. showOptionDialog/showInternalOptionDialog自定義對話框,可以替換showConfirmDialog所產(chǎn)生的對話框,只是用起來更復(fù)雜
JOptionPane產(chǎn)生的所有對話框都是模式的,在用戶完成對話框交互前都會1直阻塞當前的線程
Swing提供了1些具有特殊功能的容器,用于創(chuàng)建1些更復(fù)雜的用戶界面
JSplitPane用于創(chuàng)建1個分割面板,它可以將1個組件(通常是容器)分割成兩個部份,并提供1個分割條,用戶可以調(diào)劑兩部份的大小
創(chuàng)建分隔板時可以制定1個newContinuousLayout參數(shù),該參數(shù)指定分割面板是不是支持連續(xù)散布(分割線兩邊組件將不斷的調(diào)劑大小)
JTabbedPane可以很方便的在窗口上放置多個標簽頁,每一個標簽頁相當于取得1個與外部容用具有大小相同的組件擺放區(qū),通過這類方式,可以在1個容器里放置更多的組件
如果需要使用JTabbedPane在窗口上創(chuàng)建標簽頁步驟以下
1.創(chuàng)建1個JTabbedPane對象(構(gòu)造器包括以下兩個參數(shù) tabPlacement 指定標簽頁放置的位置 tabLayoutPolicy 指定標簽頁的布局策略 有兩種(JTabbedPane.WRAP_TAB_LAYOUT)標題換行 (SCROLL_TAB_LAYOUT)使用轉(zhuǎn)動條顯示)
2.調(diào)用JTabbedPane對象的addTab() insertTab()()等方法來增刪改查(不要使用add()方法來增加組件 后插入的組件會覆蓋之前增加的組件)
3.如果需要某1個標簽顯示出來則可以調(diào)用JTabbedPane的setSelectedIndex()方法來實現(xiàn)
4.程序還可以通過JTabbedPane提供的1系列方法來操作JTabbedPane的相干屬性
5.如果程序需要監(jiān)聽用戶點擊某1個標簽,則可使用監(jiān)聽器來監(jiān)聽JTabbedPane對象
JLayeredPane是1個代表有層次深度的容器,它允許組件在需要時相互疊加,當向JLayeredPane容器中添加組件時,需要為組件指定1個深度索引,其中層次索引較高的層的組件位于其他層組件之上
向JLayeredPane中添加組件必須要顯示的設(shè)置該組件的大小和位置 ,否則該組件顯示不出來
JDesktopPane 需要和JInternalFrame組合使用,其中JDesktopPane代表了1個虛擬桌面,而JInternalFrame則用于創(chuàng)建內(nèi)部窗口 創(chuàng)建步驟以下
1. 創(chuàng)建1個JDesktopPane對象,
2. 使用JInternalFrame創(chuàng)建1個內(nèi)部窗口,創(chuàng)建內(nèi)部窗口時除可以穿字符串作為窗口的名字還可以傳4個Boolean值 用于表示是不是允許改變窗口大小 關(guān)閉窗口 最大化窗口 最小化窗口
3. 1旦取得內(nèi)部窗口以后,該窗口的用法和普通窗口的用法基本1樣,1樣可以制定該窗口的布局管理器,可以添加組件。。
4. 將該內(nèi)部窗口以適合的大小適合的位置顯示出來(該窗口默許大小是0*0 位于 0,0處于隱藏狀態(tài))
5. 將內(nèi)部窗口添加到 JDesktopPane 容器,在將 JDesktopPane 容器加到其他容器
JDesktopPane 不能獨立存在,必須將 JDesktopPane 添加到其他頂級容器中才能正常使用
java 1.4 開始Swing部份組件就提供了默許的拖放支持,除此以外,Swing還提供該了1個非常特殊的類 TransferHandler,它可以直接將某1個組件的指定屬性設(shè)置為拖放目標(條件該組件具有該屬性的setter方法)
java 7 提供了重大的更新包括對Swing的更新,對Swing的更新除前面介紹的Nimbus外觀改進了JColorChooser組件外,還有兩個重要的跟新 JLayer和創(chuàng)建不規(guī)則窗口
JLayer的功能是在指定的組件上額外的添加1個裝潢層,開發(fā)者可以在這個裝潢層上任意繪制,可以指定組件添加任意裝潢
JLayer1般總是要和LayerUI1起使用 ,而LAyerUI用于被擴大,擴大時重寫它的paint(Graphics g ,JComponent c)方法
java 7 位Frame提供了兩個方法
serShape(Shape shape) 設(shè)置窗口的形狀
serOpacity(float opacity)設(shè)置窗口的透明度
使用JProgressBar可以非常方便的創(chuàng)建進度條,步驟以下
1.創(chuàng)建1個JProgressBar對象,創(chuàng)建對象時可以指定3個參數(shù),(用于設(shè)置進度條的排列方式 進度條的最大和最小值)
2.調(diào)用該對象的經(jīng)常使用方法設(shè)置進度條的普通方法
3.當程序中工作進度完成改變時,調(diào)用用于JProgressBar對象的setValue()方法
ProgressMonitor的用法和JProgressBar的用法基本相似,只是ProgressMonitor可以直接創(chuàng)建1個進步對話框 ProgressMonitor提供以下構(gòu)造器
ProgressMonitor(Component parentcom ,Object message , String note ,int mix ,int max)
使用ProgressMonitor創(chuàng)建的對話框包括的進度條是1個非常固定的 程序乃至不能設(shè)置該進度條是不是包括邊框,(總是包括邊框)不能設(shè)置進度不肯定,不能改變進度條的方向(總是水平方向)
JSider的用法和JProgressBar的用法非常相似,這1點可以從它們同享同1個Model類看出來 主要區(qū)分以下
1.JSlide不是采取填充色彩的方式來表示該組件確當前值,而是采取滑塊的位置來表示該組件確當前值
2.JSider允許用戶手動改變滑動條確當前值
3.JSider 允許為滑動條指定刻度值,這系列的刻度值可以是連續(xù)的數(shù)字,也能夠是自定義的刻度值,乃至多是圖標
使用JSider的構(gòu)造器創(chuàng)建滑動條的步驟以下
1.使用JSider的構(gòu)造器創(chuàng)建1個JSider對象,
2.調(diào)用JSider的以下方法來設(shè)置滑動條的外觀樣式
3.如果程序需要在用戶拖動滑塊時做出相應(yīng)的處理,則應(yīng)為JSider對象添加時間監(jiān)聽器
4.將JSider對象添加到其他容器中顯示出來
JSpinner組件是1個帶有兩個小箭頭的文本框,這個文本框只能接收滿足要求的數(shù)據(jù),用戶既可以通太小箭頭調(diào)劑該微調(diào)控制器的值,也能夠直接在文本框內(nèi)輸入內(nèi)容來改變文本框微調(diào)控制器的值
通常JSpinner組件常常需要和SprinnerModel結(jié)合使用,其中JSpinner控制組件的外觀,而SprinnerModel控制該組件的內(nèi)部狀態(tài)數(shù)據(jù)
JSpinner組件的值可以是數(shù)值 日期 和List中的值
JSpinner組件還可以是任意系列 只要這個系類可以通過previous() next() 取得值便可,在這類情況下用戶必須自行提供SpinnerModel實現(xiàn)類
JList 和JComboBox都是極為相似的,他們都有1個列表框,只有JComboBox的列表框需要以下拉方式顯示出來
JList JComboBox都可以通過調(diào)用setRenderer()方式來改變列表框的表現(xiàn)情勢
如果僅需要創(chuàng)建1個簡單的列表框,則直接使用他們的構(gòu)造器便可,他們的構(gòu)造器都可以接收1個對象數(shù)組或元素類型的任意Vector作為參數(shù),這個對象數(shù)組或元素類型任意的Vector里的所有元素將被轉(zhuǎn)換為列表框的列表項
步驟
1.使用JList JComboBox的構(gòu)造器來創(chuàng)建1個列表框?qū)ο?/span>
2.調(diào)用JList JComboBox 的各種方法來設(shè)置列表框的外觀行動
3.如果有需要監(jiān)聽列表框選項的變化,則可以通過監(jiān)聽器來實現(xiàn)
Swing的絕大部份組件都實現(xiàn)了MVC的設(shè)計模式,其中JListModel 和 JComboBoxModel只負責組件的外觀顯示,而組件的狀態(tài)數(shù)據(jù)保護則有對應(yīng)的Model負責,JList對應(yīng)的Model是ListModel接口
當使用JListModel 和 JComboBoxModel經(jīng)常常需要動態(tài)的增加插入刪除列表項
但是JListModel 并沒有提供這些類似的方法,實際上對JList還是很難刪除列表項。
所以應(yīng)當在創(chuàng)建JList時顯示使用DefaultListModel作為構(gòu)造參數(shù)
由于DefaultListModel作為JList的Model,它負責保護JList組件的所有列表數(shù)據(jù)
為何JComboBox提供了增刪改 而 JList沒有
由于 直接使用數(shù)組 vector 創(chuàng)建JList和JComboBox對應(yīng)實現(xiàn)類不1樣,創(chuàng)建JComboBox的Model是DefaultComboBoxModel,這是1個可變集合類,所有使用數(shù)組集合可以直接增刪改
但使用數(shù)據(jù)Vector創(chuàng)建的JList對應(yīng)的Model分別是JList$1,JList$2 (內(nèi)部類)
DefaultListModel和DefaultComboBoxModel 是兩個強迫保存所有列表項的Model類,他們使用Vector來保存所有列表項
JList 和JComboBox 都可以支持圖標列表,如果創(chuàng)建JList 和JComboBox 傳入圖標數(shù)組,則創(chuàng)建的JList 和JComboBox 列表項就是圖標
ListCellRender只是1個接口,它并未強迫指定列表項繪制屬于那種組件,因此可擴大任何組件來實現(xiàn)ListCellRender接口
樹是圖形用戶界面中使用非常廣泛的GUI組件,
1個樹只能有1個根節(jié)點如果1個樹有多個節(jié)點,那它就不是樹1棵樹了,而是多棵樹的集合,也被稱為森林
Swing使用JTree對象來代表1棵樹,(實際上也能夠是森林)JTree樹種節(jié)點可使用TreePath來標識,該對象封裝了當前節(jié)點及所有父節(jié)點
節(jié)點及所有的父節(jié)點才能標識1個節(jié)點
1個節(jié)點有2種狀態(tài)
1.展開狀態(tài)
2.折疊狀態(tài)
只有當某1個節(jié)點的所有父節(jié)點(直接的和間接的)都全部展開才能是可見的
如果希望創(chuàng)建1棵樹,則直接使用JTree構(gòu)造器創(chuàng)建JTree對象便可
為了利用根節(jié)點來創(chuàng)建JTree,程序需要創(chuàng)建1個TreeNode對象(接口),該接口有1個子接口MutableTreeNode,程序可以通過該接口的實現(xiàn)類DefaultMutableTreeNode來創(chuàng)建樹節(jié)點并通過add()方法來添加節(jié)點之間的父子關(guān)系
DefaultMutableTreeNode提供還提供了深度優(yōu)先遍歷和廣度優(yōu)先遍歷兩個方法
JTree生成的樹默許是不可編輯的,不可以添加、刪除節(jié)點,也不可以變換節(jié)點,如果想讓某1個樹變成可編輯狀態(tài),則可以調(diào)用JTree的setEditable(Boolean b)改成true便可變成可編輯的樹了
JTree處理節(jié)點有兩種方式
1.1種是根據(jù)TreePath
2.另外一種是根據(jù)節(jié)點行號
所有JTree顯示的節(jié)點都有1個唯1的行號,只有那些被顯示出來的節(jié)點才有行號,(如果該節(jié)點之前被展開 折疊或修改 那末該節(jié)點行號可能產(chǎn)生變化)所以使用TreePath比較穩(wěn)定
JTree專門提供了1個TreeSelectionModel對象來保存該JTree選中狀態(tài)信息,也就是說JTree組件背后隱藏了兩個model對象,其中TreeModel用于保存該JTree的所有節(jié)點數(shù)據(jù),而TreeSelectionModel用于保存該JTree中被選中的信息
程序可以通過getSelectPath 和getSelectPaths()方法來獲得被選中的TreePath 實際上這兩個方法還是依賴于TreeSelectionModel
JTree也可也改變樹節(jié)點的外觀,包括改變節(jié)點的圖標,字體等,乃至可以自由繪制節(jié)點的外觀,為了改變外觀,可以通過樹指定自己的CellRenderer來實現(xiàn),JTree默許使用DefaultTreeCellRenderer來繪制每一個節(jié)點 該類是JLabel的子類
改變樹節(jié)點的外觀樣式 可以有以下3種方式
1.使用DefaultTreeCellRenderer直接改變節(jié)點的外觀,這類方式可改變整棵樹所有節(jié)點的字體色彩和圖標
2.為JTree指定DefaultTreeCellRenderer的擴大對象作為JTree的節(jié)點繪制器,該節(jié)點負責為不同的節(jié)點使用不同的字體色彩和圖標
3.為JTree指定1個實現(xiàn)TreeCellRenderer接口的節(jié)點繪制器 該節(jié)點可為不同的節(jié)點自由繪制任意內(nèi)容
DefaultTreeCellRenderer類實現(xiàn)了TreeCellRenferer接口,給接口里只有1個用于繪制節(jié)點內(nèi)容的方法 getTreeCellRendererComponent(),該方法負責繪制JTree節(jié)點
DefaultTreeCellRenderer類繼承了JLabel,實現(xiàn)getTreeCellRendererComponent()方法時返回this,返回的是JLabel對象
程序?qū)崿F(xiàn)TreeCellRenderer時1樣要實現(xiàn)getTreeCellRendererComponent()方法,該方法返回任意類型的組件,該組件將作為JTree節(jié)點
程序一樣是通過擴大JPanel來實現(xiàn)TreeCellRenferer
使用JTable來創(chuàng)建表格是非常容易的事情,JTable可以把1個2維數(shù)據(jù)包裝成1個表格這個2維數(shù)據(jù)包可以是2維數(shù)組也能夠是集合元素為Vector的Vector對象
在默許情況下 JTable的表格數(shù)據(jù),表格列表全部都是字符串內(nèi)容,可以通過特定的TableModel或自己制定自己的單元格繪制器來實現(xiàn)
通常應(yīng)當講JTable對象放在JScrollPane容器由JSrollPane為JTable提供viewPort(不但可以為JTable增加轉(zhuǎn)動條,而且可讓JTable的標題顯示出來,如果不把JTable放在JScorllPane中 JTable默許不會顯示列標題)
與JList. JTree類似的是,JTable采取TableModel來保存表格中的所有狀態(tài)數(shù)據(jù),與ListModel類似的是,TableModel 也不強迫保存該表格顯示的數(shù)據(jù),
也能夠通過TableModel對象來創(chuàng)建表格。
JTable使用TableColumnModel 來保存該表格所有數(shù)據(jù)列的狀態(tài)數(shù)據(jù),如果程序需要訪問JTable的所有列狀態(tài)信息,則可以通過獲得該JTable的TableColumnModel來實現(xiàn)
使用JTable實現(xiàn)的表格并沒有實現(xiàn)排序功能,但是可使用AbstactTableModel類來實現(xiàn)該功能,只要TableModel實現(xiàn)了getValueAt(),getColumnCount(),getRowCount(), JTable 就能夠根據(jù)該TableModel生成表格,因此可以創(chuàng)建1個SortableTableModel實現(xiàn)類,將TableModel封裝起來,并實現(xiàn)排序功能
下一篇 粗淺看 XML