一 拋磚引玉
本文指在利用一個小程序”Swing 組件大全”來引導大家學習Java這門語言,熟悉Java Swing的各個組件。並在學習過程中參考作者設計這一程序的方法和思想,最終形成自己的思維方式和學習方式。你能舉一返三是作者最開心的事情。小程序演示了Java Swing大部分組件。最後附上了全部代碼及詳細的注釋說明。希望本文能對大家學習Java有所幫助。
隨著Java風潮席卷國內,學習Java的方法和路徑越來越多。而在大量的書本前,在Java龐大的類庫前大大家都有點迷失方向的感覺,是學J2EE,J2ME還是。。。。。。然而所有的這些都或多或少的離不開J2SE。萬丈高樓平地起。J2SE是整個Java的基礎,學好了這個對Java的各個方向都是很有利的。而學習J2SE的最初點就在界面設計,因為界面編程是你來感覺最直接的手段,是提高大家編程興趣的很好開始,因為你寫完程序編譯後可馬上看到自己的成果。而不像後台編程做完了都感受不到效果。而好的界面也是你測試你其他程序的基礎。
界面設計!不就是拖拉操作嗎?如果是VB,VC等可視化的編程,的確只是一些拖拉操作,由於Java語言的設計中所有的東西都是程序代碼,在Java中如果想要設計一個好的界面,可不是簡單的拖拉操作能完成的。即使使用了如JBuilder這麼強大的可視化工具,你也得親自動手寫一些界面設計代碼才能很好的完成你的任務。如果你能在此基礎上理解Java界面設計的思想,對你學習這門語言將有莫大的幫助。
Java界面設計主要涉及Awt,Swing兩大類庫,Swing是Awt的擴展和功能加強。下面我們就以Swing為基礎來說說整個Java的界面設計。
二 感受效果
在開始之前,讓我們看看這篇文章要達到的效果,有了目標和成果才有學習的興趣,起碼我是這樣認為和學習的。如下圖所示,這就是我們設計的界面,它包括了Swing中大部分常用的組件。有些功能界面上反映不出來,大家可嘗試編譯源代碼點南擊各個部分,看看它們的響應事件。
三 設計思想和方法
不知道大家(一般是初學者)在看編程書籍的時候有這種體會沒有:在看的過程中,好像大部理解了,並且效率還不錯,可是回頭來要自己寫個和書上一樣的程序出來,可能不少人只有重新拿書照打的了;有些人在照書上打過了一遍,也似乎理解了。可回頭來真正到用的時候,好像又不記得了。作者本人在初學編程時就經歷過很多次這種情況。
追其原因,無外乎沒有融會貫通所學的知識,編程最講求動手二字,動手的真正意義在於寫自己所想所領會的程序而不是copy現成的程序。因為只有經過自己思考,設計才能把書上的知識真正溶入自己的大腦。下面我們以”Swing 組件大全”來說說這個方法和思想。
在看完書上介紹的Swing組件這章後,我心中對Swing大概有了個了解,只差動手了。而本人又不想照書上的例子一個個來試。於是就想到了做個程序把書上介紹的所有組件放到一個界面來,並嘗試用到書上介紹的所有方法。
砍柴不誤磨刀功!在開始這前,我手畫了一份設計圖紙,如上面界面所示(當然沒那麼漂亮了)。並用簡單的軟件工程思想對結構進行了大概的劃分。這裡把整個界面劃分為一個主模塊和五大子模塊。所有的子模塊都是繼承至相應的容器,主模塊SwingTest既是管理模塊也是主界面,繼承JFrame主框架,管理本身的屬性及JFrame上的其他子模塊。MenuTest子模塊繼承至JmenuBar負責菜單的顯示和事件處理。其他子模塊繼承至JPanel,管理放置在其上的組件的布局和顯示。從子模塊的名字大家也可看到他們的位置和功能。如下圖所示:
在編寫程序前想好結構和思路是個很好的習慣,它將會幫你大大減少工作量,提高程序的可讀性和效率。
四 容器,布局管理器,嵌板
Swing中所有的組件都是放到容器中,主要的容器包括:JFrame,JPanel,JWindow,JDialog,JPanle。JFrame是java的主框架,幾乎所有的Java應用程序界面都是在主框架之中設計的。有些容器並非一層,而由幾層嵌板組成,本文將會用到其中在個:拆分嵌板(JSplitPane),內容嵌板, 頁簽式嵌板(TabbedPane)
拆分嵌板:按指定的方向和方式拆分其內的兩個子組件,記住一個拆分嵌板只能拆分兩個子組件,如果想要拆分三個,大家自己先想一想辦法。本節最後給出了答案。
內容嵌板: JFrame,Jwindow,Jdialog就是上面提到的有多層嵌板的容器,如果要在這些容器上面放置組件,必須放置在他們的內容嵌板(pane)上。我們通過函數getContentPane()可得到當前容器的內容嵌板。
頁簽式嵌板:這個嵌板如同卡片,在上面提供文件夾式的頁簽,當前只顯示一頁,如要進入下一頁,只要點擊上面的頁簽。
有些如JPanel是可以直接放置組件的容器。所以不需要使用嵌板。
如果要按自己的想法排列放在容器上的組件,我們必須使用到布局管理器(Layout)來進行管理。Java系統默認的布局管理器為邊界管理器(BorderLayout)。它把版面分為五大塊,中央區域(Center),頂端(North),底部(South),左側(West),右側(East),細心的你可能會發現我們的主界面就是用的這個布局架構。其他的幾個布局管理器有:
流布局(FlowLayout):把其內的組件按從左到右,從上到下的流方式排列。
網格布局(GridLayout):把組件放置到布局中的設置的每個網格中
無序網格布局(GridBagLayout):類似於網格布局,但功能更強大也更復雜。能處理所有的布局。
如果你仔細觀察會發現我們的主界面最右邊會發現使用了網格布局。
下面來看看我們的主模塊的構造函數代碼,來感受一下上面的結構設計。
public SwingTest()
{
// 初始化所有子模塊
MenuTest menuTest = new MenuTest();
LeftPanel leftPanel = new LeftPanel();
RightPanel rightPanel = new RightPanel();
BottomPanel bottomPanel = new BottomPanel();
CenterPanel centerPanel = new CenterPanel();
// 設置主框架的布局
Container c = this.getContentPane();
// c.setLayout(new BorderLayout())
this.setJMenuBar(menuTest);
c.add(leftPanel,BorderLayout.WEST);
c.add(rightPanel,BorderLayout.EAST);
c.add(centerPanel,BorderLayout.CENTER);
c.add(bottomPanel,BorderLayout.SOUTH);
setSize(700,500);
setTitle("Swing 組件大全簡體版");
// 隱藏frame的標題欄,此功暫時關閉,以方便使用window事件
// setUndecorated(true);
setLocation(200,150);
show();
}
如拆分三個子組件,可把一個拆分嵌板做為另一個拆分嵌板的子組件!
五 事件模型
在Swing 中每個組件都可觸發事件,一旦觸發事件會被一個或多個Listener(監聽器)接收。不同類型的事件分別由個別的class表示。事件發生點可以和處理事件的代碼分開。
要想處理事件,只要產生Listener對象,並調用組件的addXXXListener()方法注冊事件。我們大部分是通過繼承事件接口來處理事件的。但是繼承Java接口我們必須實現出接口中的所有方法。有些接口包含了大量的函數,如果要一個個實現是件很麻煩的事件上,Java中定義了相應接口的Adapter接配器類來解決這種情況。接配器類已經幫我們實現了接口的所有方法,而我們只要繼承接配器就可在代碼內做我們想做的事情。也即只要實現或覆寫我們想要實現的方法。
下面我們還是以主模塊為例,來處理關閉窗口事件。
// 利用無名內隱類,增加窗口事件
this.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
// 釋放資源,退出程序
dispose();
System.exit(0);
}
});
如上所示,我們向主框架注冊了一個窗口事件addWindowListener(),事件繼承了WindowAdapter接配器,並重載了方法WindowClosing(),方法中利用dispose()釋放窗口資源,System.exit(0)關閉窗口。
六 總結
好了,我們來回顧一個我們的上面的內容:設計的思路,容器,嵌板,布局管理器, Swing組件的事件。
大家明白了為什麼做項目能快速提高自己水平了吧。其實上面的方法原理和做項目差不多,任何事只要經過自己的大腦思考,親手操作,想忘記並不是那麼容易的了。相信看了本文和代碼再輔以相關的書籍介紹,大家對Swing處理會有一定的感性理解了。
開始動手吧。發揮你的天才思維,自己設計一個更好的Swing組件大全吧。當然你也可在本程序的基礎上完善其中更復雜的功能。比如:把樹形列表內容用window文件資源器代替,把表格的處理和數據庫相連接或和相關數據連接,讓文本區可顯示圖片。。。。。哦,天啊。說不定一個好的產品也會因此誕生。
再次強調開始之前請先設計你的界面,畫出你的程序結構圖。即使再小的程序也請你大概勾一個它的輪廓。
七 具體代碼
由於代碼中已經附上了比較詳細的注釋,在此就不一一解釋說明了。在此要提醒大家在研究源代碼時要注意幾個復雜的組件的處理方式:如樹形組件(JTree),表格(JTable),文本區(JtextArea),定時器(Timer)。為了方便大家直接復制源代碼來編譯,所有的模塊都是放在一個主類中實現的。所有源代碼的事件都是用嵌套的內隱類方法來實現的。如果大家不習慣這種寫法,程序中已經消除了各模塊之間的關聯性,可很方便的把各子模塊分離成類文件。代碼只是演示了Swing的大部組件,各個組件沒有很深入的處理了。