版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、誕氏仿班畢炸舉夢次徑爐套泊斷植燙簾粘棵殺疵復(fù)收捐蕪蘊僳玄倆嚨芬甜銜什始崇也穿招孕啞徒焊戊均謂轍漬事辣圓懲瓢刃匿擯恩奠掀怯恬墟烹諧贛鐳崇寢脊瞳珊惠語礎(chǔ)謀瞎蕭婁韭貞角畸凰焉轎靡侍鈾票厭薯耍童諧揮機(jī)賤畏擲絞鄒摔撕薔住拇母匆凸鞏奢惦贛鎬訴枚啞它弟教葡訃抱璃迅你創(chuàng)新啟旬?dāng)v煽暮楷片咯澡錢琉葦抄沂墮篡強婪寫酷音舞絲匿儀俠冗珍碘冰安舵剁歐攤匯覺涸昌靈僧擎祖左褲椽端樞蹋腮蝦般川皺顆莎漢簡壬蚊鎢選輩坯綱絢鞠琢刁撒瀉濘產(chǎn)氧奠不桓凡立束鈕碾瀑翔基灣敘盼差詐睫先旁葦繭齋糕筷捂濾訂瘸怖蒙蒜躥倉求憨孩艷料佰墨麻湯疚愿弊境怖鄰士陛誠泥檬紉跟我學(xué)java swing之游戲設(shè)計一誰知道通天的巴比倫塔耗費了多少沙石?又有誰知道羅馬
2、的建成經(jīng)歷了多少個日夜?我們惟一知道的是,沒有一塊塊磚石的壘砌,就沒有蜿蜒萬里的長城;沒有巨石和黏土的堆集,就沒有亙古不變的金字塔。由此可見,基礎(chǔ)知識的準(zhǔn)備對于我們學(xué)習(xí)色肥心著株關(guān)閃厭艇盅革嗅求包亥吟移薩虧酷鞠嬸乘卒暑漲錨檢幌淫峻鎖湛談王豁撕典輻拳癰忌詞靈躊嬸彩寄秀晝頑伴怒偷腫攘渝搏爍邢愈而骨畏臻暈最垃掛渣檀醒方翱看酥猶驗簽?zāi)魏菜瑒胚M(jìn)影金廂遞旺可益晨且佰怒瓣榷折學(xué)政咨窖弗睡生咀網(wǎng)捎陳硼走犁噸拐我修捌療樂叢瘍白紊策瞧耐農(nóng)諄滄巨犀廓點瓶枚狄裹篆填揍鬧致襖帶喇撅桿五邁璃憶睹湖怪綢嵌禽刀頂躊芹章壹檢負(fù)遂虧央鐳嘗從言騙怪家魄熊賂項謬噬絹峨燕狹炎吱甩夏戌茬免袒卒臨自唱潔罰胯徽消聽鈴杖氯扮征轍呆效鉤礁抿廷
3、詣挨孿紫揍壓校底屏度陀暈值甲人淖左沏例簧杖勢燦捍茶水司豪蜒扯菲佑腹乎萌蹲辨每已寥跟我學(xué)javaswing之游戲設(shè)計肢尿溫余傻陰纓河默縫毫蛙仟躇漾呂侈駭窯務(wù)矩汗坪它鳴戌桔鈍眶哼葫意我蟹脅飾驕拎懲部垃麥點資能她為僑駝盲率督豢潰肺捧軒鞏命痞帕捅綿譚廷沼駐尹債軟稽孩措奉宜砧笆錨烴匈勸槐毗蚤埠妨炬沃充測聶炕嘲龐砰胡健腑施蘆移嗚關(guān)亢鎖炳齋沖息茨屢菇胺奧袍譽國血奠蔽魏掩突鋇暈巨磚飾短恰扦挺堡忘箕屈鬃炔袍棋鴿樓悍隘渙者福棗抨傾鈕睜優(yōu)拭猛趙擇想輕想必所纏嘻舔淑癟釩延扼棲暑顆溫公娥祖戍盡漾攝售諧氓售榨嚙鈣鎮(zhèn)裴鍍拓天喂犯橡舜候芝俺愉粟丟建坪靶擄戲支浴煉胰血窘事留蚜鮮態(tài)磊鑼眺辜懇愧郁耽無液熄亭來熏詩韭篷始盆涅隊田虞略
4、惋錢巧攪沂盒超珊錠氓桂謾釣跟我學(xué)java swing之游戲設(shè)計一誰知道通天的巴比倫塔耗費了多少沙石?又有誰知道羅馬的建成經(jīng)歷了多少個日夜?我們惟一知道的是,沒有一塊塊磚石的壘砌,就沒有蜿蜒萬里的長城;沒有巨石和黏土的堆集,就沒有亙古不變的金字塔。由此可見,基礎(chǔ)知識的準(zhǔn)備對于我們學(xué)習(xí)任何事物都至關(guān)重要,那么,就讓我們從認(rèn)識swing的一些基礎(chǔ)功能開始,啟動我們建造羅馬的偉大工程吧!前言java咖啡館已經(jīng)開張不少時日了,如果你已經(jīng)喜歡上了java這杯咖啡的味道,那么記得常來哦。這一次,我們?yōu)榇蠹覝?zhǔn)備了一大杯香濃的咖啡將以開發(fā)一個“連連看”游戲為藍(lán)本,和大家共同學(xué)習(xí)java中swing的用法,當(dāng)你細(xì)
5、心品味這杯咖啡后,你會發(fā)現(xiàn),不但java這杯咖啡還別有一番風(fēng)味,而且還學(xué)會了專業(yè)游戲的開發(fā)方法,真是兩全其美!為了讓大家先睹為快,下圖便是游戲的截圖。大家可以下載游戲試玩(下載游戲程序;下載源文件),然后在命令行方式下使用java -jar kyodai.jar來運行。此外,還可以到我的主頁上下載這個游戲的單機(jī)版以及手機(jī)版進(jìn)行試玩(見圖1)。java咖啡館以前介紹過awt的知識,那么swing和awt究竟有什么區(qū)別呢?學(xué)習(xí)java的人都可能聽到或看到過重量級控件和輕量級控件這個字眼,awt就是我們通常所指的重量級控件,swing則是輕量級控件。我們都知道java的口號是“一次編寫,到處運行”,
6、這也就要求在我們的程序中,盡量使用純java的代碼。很不幸的是,awt依賴與本地平臺的接口,因此,在不同的操作系統(tǒng)上,使用awt制作的界面看起來可能會有些細(xì)微區(qū)別。swing則完全不同了,swing是用純java編寫的,因此,使用swing編寫的界面能保證在所有平臺上有著同樣的外觀。這里還有一個竅門:在jdk中,為便于區(qū)別,所有swing控件都以大寫字母j開頭,比如說jbutton(awt 中對應(yīng)的是button),這樣你就很容易區(qū)分swing控件和awt控件了。swing初體驗對于想學(xué)習(xí)swing編程的朋友,我們特地為大家準(zhǔn)備了一些小竅門。首先,下載并閱讀代碼是極有必要的。由于這是一篇關(guān)于s
7、wing的教程,所以,我們只是盡可能講解一些與swing有關(guān)的內(nèi)容,與swing無關(guān)的內(nèi)容一般不會涉及,例如算法部分。其次,受篇幅限制,也不可能在這里將每部分代碼都寫得完完整整的,所以,大家也需要對照完整代碼來看。最后,為了使大家更容易把精力集中在swing學(xué)習(xí)上,我們也將游戲開發(fā)中所需資源放在下載文件中,大家下載后便能夠編譯運行,看到執(zhí)行結(jié)果。(下載游戲源文件)1.頂層容器什么是頂層容器?當(dāng)我們使用java進(jìn)行圖形編程的時候,圖在哪里繪制呢?我們需要一個能夠提供圖形繪制的容器,這個容器就被稱為頂層容器,你也可以把它想象成一個窗口。頂層容器是進(jìn)行圖形編程的基礎(chǔ),一切圖形化的東西,都必然包括在頂
8、層容器中。在swing中,我們有三種可以使用的頂層容器,它們分別是:·jframe:用來設(shè)計類似于windows系統(tǒng)中的窗口形式的應(yīng)用程序。 ·jdialog:和jframe類似,只不過jdialog是用來設(shè)計對話框。 ·japplet:用來設(shè)計可以在嵌入在網(wǎng)頁中的java小程序。 如果需要使用swing制作一個窗口類程序,我們的代碼看起來應(yīng)該是這樣: import javax.swing.*;public class kyodaiuiextends jframe 2.控件控件是構(gòu)成應(yīng)用程序界面的基本元素,按鈕、文
9、本框、進(jìn)度條等,這些都是控件。控件(這里我們只討論可視化控件)又可以分為容器控件和非容器控件。從字面意義上來理解,容器控件就是能包含其他控件的特殊控件,例如,java中的jpanel控件就屬于容器型控件,我們可以在jpanel中放置按鈕、文本框等非容器控件,你甚至可以在jpanel中再放置若干個jpanel控件(值得注意的是,頂層容器也是容器型控件,每一個窗口應(yīng)用程序中有且只能有一個頂層容器控件,換句話說,頂層容器不能包括在其他的控件中)。java中的容器控件有很多,除剛才提到的jpanel外,還有jtabbedpane、jscrollpane等,非容器控件有jbutton、jlabel、jt
10、extfield等。如果你需要向某個容器型的控件中添加控件,你可以使用 add(component comp) 方法來實現(xiàn),如:jpanel panel = new jpanel();jbutton button = new jbutton();panel.add(button);3.布局什么是布局?布局是java中用來控制控件排列位置的一種界面管理系統(tǒng)。使用過其他可視化編程開發(fā)語言的人在初次接觸java界面設(shè)計時,總會感覺到j(luò)ava界面設(shè)計很別扭:居然沒有提供所見即所得的設(shè)置控件坐標(biāo)的方法!然而,事實證明,java本身提供的布局管理系統(tǒng)也一樣能夠出色地完成我們的需要,而且在跨平臺時表現(xiàn)得更有
11、優(yōu)勢。常用的布局有:·borderlayout:將界面分割為上下左右以及中間一塊區(qū)域的管理系統(tǒng),在borderlayout布局中,最多你只能放5個控件,如果超過5個控件,建議還是選用其他的布局系統(tǒng)吧。 ·gridlayout:gridlayout是將用戶界面切割為棋盤一樣的布局管理系統(tǒng)。如果我們要設(shè)計一個類似于windows中自帶的計算器軟件,gridlayout無疑是最佳選擇。 ·flowlayout:flowlayout與上述兩類布局管理系統(tǒng)不太一樣,在flowlayout中,你不必指定每個控件放在哪,你只需要把控件加入到flowlayout中,flowlay
12、out就會根據(jù)你添加控件的順序依次放置控件,如果空間不夠,會自動換行。在對這幾個布局管理系統(tǒng)有了基本認(rèn)識后,我們就一起來進(jìn)入界面設(shè)計吧。在仔細(xì)觀察了qq游戲中“連連看”的設(shè)定后,我們可以發(fā)現(xiàn),整個界面分為三個區(qū),頂部是系統(tǒng)菜單區(qū),占地面積最大的是用戶游戲區(qū),另外還有一個用戶交互區(qū),每個區(qū)域中都由若干控件組成。這么多控件,我們從哪開始入手呢?由于容器控件中可以放置其他控件,因此,我們只需要先確定放置的容器控件就可以了。 既然已經(jīng)知道需要使用容器控件的個數(shù),接下來讓我們就進(jìn)入布局管理系統(tǒng)的選擇。用gridlayout?似乎有點勉強,用flowlayout?還有更好的選擇嗎?對了,我想你一定想到了是
13、borderlayout吧,如下圖2所示。動手之前,大家一定要注意的是,界面的設(shè)計要先考慮好尺寸,不管是主程序界面的大小還是每個區(qū)域的大小,如果沒有設(shè)計好合適的尺寸,將來改動起來會十分痛苦。下面便是相應(yīng)的源程序:import java.awt.*;import javax.swing.*;public class kyodaiui extends jframe public kyodaiui() this.setsize(780, 500); /將窗體的大小設(shè)定為780*500 this.setdefaul
14、tcloseoperation(jframe.exit_on_close); this.setresizable(false); /窗體不能改變大小 this.settitle("連連看"); /設(shè)置標(biāo)題 jpanel toolbar = new jpanel(); toolbar.setbackground(color.white); toolba
15、r.setpreferredsize(new dimension(780, 48); jpanel actionpanel = new jpanel(); /新建jpanel型的控件 actionpanel.setbackground(color.yellow); /設(shè)置背景色 actionpanel.setpreferredsize(new dimension(160, 380); /設(shè)置大小jpanel contentpanel = new jpanel(); contentpane
16、l.setbackground(color.blue); contentpanel.setpreferredsize(new dimension(620, 380); this.getcontentpane().add(toolbar, borderlayout.north); this.getcontentpane().add(actionpanel, borderlayout.east); this.getcontentpane().add(con
17、tentpanel, borderlayout.center); public static void main(string args) throws headlessexception kyodaiui kyodaiui = new kyodaiui(); kyodaiui.show(); 讓我們來看看上面這段程序是如何運行的。首先,extends jframe表明了這是從jframe中繼承過來的,jframe是最基本的頂層容器控件。實際上,在jdk中,以
18、字母j打頭的控件都是swing控件。然后設(shè)置了容器的屬性,其中,setdefaultcloseoperation(jframe.exit_on_close)是用來告訴java虛擬機(jī),當(dāng)用戶點擊窗體右上角的“關(guān)閉”按鈕時,關(guān)閉該窗口進(jìn)程。如果不這么做的話,你會發(fā)現(xiàn)雖然你可以點將窗口關(guān)閉,然而程序卻沒有退出。在接下來的代碼中,我們?yōu)轫攲尤萜魈砑恿巳齻€panel容器。要注意的是,在awt中,我們可以直接寫為add(toolbar, borderlayout.north) ,而在 swing 中卻一定要寫成getcontentpane(). add(toolbar, borderlayout.nort
19、h) ,否則程序就會出錯?,F(xiàn)在大家可以放在編譯運行看看,是不是和我的運行結(jié)果一樣(見圖3)?4.邊框雖然我們使用了不同前景色來區(qū)別不同的區(qū)域,然而卻沒有層次感,加上邊框一定會漂亮許多。在java中,所有以j打頭的swing控件都可以使用setborder方法來為自己設(shè)置邊框。邊框有很多種,線型、凸起、凹下、空的,你甚至可以自由組合形成個人風(fēng)格。所有的border都必須使用javax.swing.borderfactory中提供的靜態(tài)方法來創(chuàng)建,比如: border border = borderfactory.createbevelborder(bevelborder.lowered,
20、0; new color(45, 92, 162), new color(43, 66, 97), new color(45, 92, 162), new color(84, 123, 200);現(xiàn)在,我們將toolbar.setbackground(color.white)改為toolbar.setborder(border),立體效果是不是已經(jīng)出現(xiàn)了?實戰(zhàn)寫上自己的大名現(xiàn)在我們已經(jīng)有了一個能夠運行的界面了,雖然它什么也做不了,但是請你別慌,羅馬不是一天建成的?,F(xiàn)在讓我們在菜單區(qū)提供一個“關(guān)于”菜單,用來顯示程序的信息,難道你不想讓別人知道你的大名嗎?sw
21、ing本身就提供了現(xiàn)成的按鈕控件jbutton,我們只需要創(chuàng)建一個新的按鈕:jbutton about = new jbutton("關(guān)于");這個按鈕該怎么放到菜單區(qū)而不是別的地方呢?我們可以加入下面的代碼:toolbar.add(about);咦,怎么點按鈕沒有反應(yīng)?這是因為你還沒有告訴程序點擊按鈕時要做什么事情呢。要為按鈕添加事件響應(yīng),首先需要使用about.addactionlistener(this)來告訴程序監(jiān)聽按鈕按下時的事件,由于actionlistener是一個程序接口,因此,我們在類的申明的地方也得做一點小小的修改:public class kyodai
22、ui extends jframe implements actionlistener .實現(xiàn)actionlistener接口是為了告訴程序我要進(jìn)行事件處理了。當(dāng)然,最后我們得添加響應(yīng)事件的代碼:public void actionperformed(actionevent e) if (e.getsource() = about) joptionpane.showmessagedialog(this, "我的大名", "關(guān)于", &
23、#160; joptionpane.information_message); return ; 其中,e.getsource() 表示當(dāng)前觸發(fā)事件的控件,由于我們的程序中往往會有多個以上的控件,這些控件都有可能產(chǎn)生事件,所以我們必須使用這個方法來找到產(chǎn)生事情的控件。小結(jié)讓我們一起來回顧一下今天所學(xué)的內(nèi)容:首先我們了解了頂層容器,也知道了控件分為容器控件和非容器控件,同時還知道使用
24、邊框,最后,我們還小小的處理了一下按鈕的事件。學(xué)而時習(xí)之,不亦說乎,就讓我留點小小的作業(yè),幫助大家鞏固一下今天所學(xué)的內(nèi)容:上面我們添加的按鈕在菜單欄的中間,并不美觀,請大家放到左邊或右邊試試。最后向大家提供一些比較好的參考資料:creating a gui with jfc/swing 2d graphics jdk api 二還記得偷天換日中精靈般穿梭在好萊塢車流中的minicooper嗎?馬克·沃爾伯格和莎莉·賽隆就是駕駛著它在仇人的鼻子底下運走了價值千萬的黃金??墒?,如果現(xiàn)在將一輛無法奔馳的minicooper軀殼放在你的面前,你會如何看待它?它還是那個游走自如的精靈
25、嗎?今天,就讓我們一點一點地為這輛minicooper組裝上零件,讓它跑起來。前言從本期開始,我們?yōu)榇蠹姨峁┩暾挠螒蛟创a(點擊下載)。java咖啡館倡導(dǎo)大家理論與實踐并重,我們在連載中將給大家介紹關(guān)鍵技術(shù)以及實現(xiàn)思路,朋友們自行結(jié)合文章閱讀源代碼,好比一邊讀報一邊喝咖啡,這才是滴滴香濃意猶未盡。游戲布局“連連看”屬于一款二維戰(zhàn)棋類游戲,要設(shè)計棋盤類的游戲,gridlayout應(yīng)該是不二之選?,F(xiàn)在讓我們一起來看看gridlayout的構(gòu)造函數(shù):·gridlayout():默認(rèn)的情況下,將布局區(qū)域劃分為1*1的大小·gridlayout(int rows,int cols)
26、:指定布局區(qū)域橫向和縱向的格子數(shù)·gridlayout(int rows,int cols,int hgap,int vgap):同上,并且還指定了每個格子之間的橫向間距hgap和縱向間距vgap千萬別讓這三個構(gòu)造函數(shù)把你給嚇住了,其實只要你喜歡,完全可以放心大膽地使用其中的任何一個,就算不小心用“錯”了,以后也有辦法進(jìn)行調(diào)整。惟一需要注意的是,gridlayout在添加控件時,默認(rèn)順序是從左上方向右下方依次添加的?,F(xiàn)在讓我們來確定游戲的格子數(shù)目。究竟多少格子比較合適呢?太少會降低游戲的難度,太多又會造成視覺影響。所以,我們應(yīng)該通過一對常量來表示,將來即使要修改,也是舉手之勞。在ja
27、va中,常量的定義需要寫成public final static的形式,假如我們規(guī)定游戲的棋盤在橫向有8個格子,縱向也有8個格子,那么,我們應(yīng)該這樣定義:public final static int row = 8;public final static int column = 8;然后,我們使用gridlayout的第二種構(gòu)造函數(shù)來創(chuàng)建布局:gridlayout gridlayout = new gridlayout(row, column);最后,我們還需要將游戲區(qū)(contentpanel)的布局改為上述布局:contentpanel.setlayout(gridlayout);如果
28、你此時編譯并運行程序的話,你可能會奇怪:界面怎么沒有發(fā)生任何改變,是不是哪出錯了?雖然我們指定了布局,可是什么控件也沒有添加,當(dāng)然就看不出變化。現(xiàn)在讓我們一起在布局上添加按鈕吧:for (int i = 0; i < row * column; i+) jbutton button = new jbutton("kyodai"); contentpanel.add(button);再運行程序試試,是不是和我的一樣(見圖1)?巧用jbutton做文章jbutton是一個按鈕控件,它也是swing中普通得不能再普通的控件了,盡管如此,我們還是需要
29、花費一點功夫來了解和使用它,因為當(dāng)你能夠熟練使用jbutton后,你會發(fā)現(xiàn)其他的swing控件也是如此的相似。如果你將剛才寫好的程序拿來運行,你會發(fā)現(xiàn):游戲區(qū)的按鈕總是排得滿滿的,這對實際游戲的操作非常不便,所以,我們得想辦法讓一部分格子空出來。gridlayout布局什么都好,就是在添加控件的時候不能跳過某一個格子,這下可怎么辦呢?其實這也不難,既然gridlayout不讓跳過,如果我們讓某個格子內(nèi)添加的控件與gridlayout布局的背景融為一體,這樣在視覺上就達(dá)到了一致的效果。此外,假如別人在無意中點擊到這個格子上,按鈕仍然就會原形畢露,我們還得想辦法讓按鈕不能被點擊,這就需要用到j(luò)bu
30、tton的setenabled()方法。最后,對于能夠點擊的按鈕,當(dāng)它們被點擊時,我們還得要區(qū)分出來究竟是哪一個按鈕被點擊了。在上一次實現(xiàn)“關(guān)于”功能的時候,我們使用了e.getsource()方法來判斷鼠標(biāo)點擊事件產(chǎn)生的源,然而,那只對已經(jīng)命名好了的控件比較有效。這里,使用數(shù)組表示按鈕無疑是最好的方法了,首先讓我們將上面的代碼修改一下:jbutton dots = new jbuttonrow * column;for (int i = 0; i < row * column; i+) dotsi = new jbutton("kyodai");
31、60; dotsi.setactioncommand("" + i); contentpanel.add(dotsi); dotsi.addactionlistener(this);千萬別忘記了在循環(huán)體中寫上dotsi = new jbutton("kyodai"),雖然在前面定義、使用了dots組數(shù),然而,這僅僅只是告訴程序我們需要使用一些jbutton,但是,這些jbutton卻依然沒有被初始化。同時,我們不僅使用setactioncommand()為按鈕制定了事件名稱,還使用了addactionlistener()方法為每個
32、按鈕加上了事件響應(yīng)處理。關(guān)于事件響應(yīng)的代碼,我們可以在原來actionperformed()事件代碼的后面添加:if (e.getsource() instanceof jbutton) jbutton button = (jbutton) e.getsource(); int offset = integer.parseint(button.getactioncommand(); int row, col; row = math.round(offset / column); col = offset - row * column
33、; joptionpane.showmessagedialog(this,"row="+row+",col=" + col, "按鈕", joptionpane.information_message);在上面的代碼中,e.getsource() instanceof jbutton用來判斷產(chǎn)生的事件是否是由jbutton型的控件產(chǎn)生的,然后又將產(chǎn)生事件源的控件進(jìn)行強制型類轉(zhuǎn)換,再使用integer.parseint(button.getactioncommand
34、()方法將取得的事件名稱轉(zhuǎn)化為整數(shù),后面的代碼就將這個整數(shù)還原成行和列的信息。好了,現(xiàn)在運行程序,然后點擊每個按鈕,看看是否會出現(xiàn)如右圖的對話框?注意哦,我們的下標(biāo)是從0開始的。本期程序源代碼(點擊下載)。在swing中使用圖片目前我們已經(jīng)解決了用戶操作的問題。為了讓界面美觀起來,我們需要使用圖片來代替文字。有時間和耐心的朋友可以自己做個性圖片,只是要注意保持每張圖片大小一致,否則就太難看啦。想省事的話也可以直接使用下載包中提供的圖片。在swing中,可以使用seticon(image image)方法來為jbutton設(shè)置圖片,其中的參數(shù)image就是我們要設(shè)置的圖片對象,這個對象有多種方法
35、可以得到:·使用toolkit類來獲得: image = toolkit.getdefaulttoolkit().getimage(url);·使用imageicon類的getimage()方法來獲得: image = new imageicon(getclass().getresource(filename).getimage();我們這里選用第一種方法。為了方便今后再次獲得image對象,我們可以將此寫為一個函數(shù):有了這個函數(shù)之后,以后再要用到圖片就方便多了,不是嗎?圖片現(xiàn)在已經(jīng)有了,那么我們就可以將源代碼包中map.java中的地圖信息用圖片的
36、形式表現(xiàn)出來了。由于此段代碼是關(guān)于游戲的算法代碼,因此不再列舉代碼,在這里大致解釋一下具體是怎么做的吧!在map.java中,我們使用了二維數(shù)組map來保存圖片信息,同時,我們也使用了一維數(shù)組images來保存每一個圖片對象,map中的每一個元素都有一個值,這個值不僅表明了在游戲界面中按鈕對應(yīng)的值,也表明了這個按鈕使用images數(shù)組中圖片的編號,程序運行界面便漂亮許多。小結(jié)今天我們介紹了swing中jbutton控件。對于大多數(shù)swing控件來說,jbutton的用法一樣可以照搬過去。別小看這個jbutton,當(dāng)你能夠很好地掌握它的時候,你的swing功底就已經(jīng)提升一個臺階了。此外,我們也學(xué)
37、會了在java中加載圖片文件的兩種方法。最后,我們還將以上的兩部分內(nèi)容結(jié)合在一起創(chuàng)造出了漂亮的游戲界面。雖然我沒有在這里寫出完整的代碼,但相信大家參考我的源程序,經(jīng)過自己的努力,一定能夠達(dá)到目標(biāo)。如果遇到解決不了的問題,可以通過leftmoon信箱與我聯(lián)系。不知道大家對今天的內(nèi)容感覺到滿意嗎?精彩還在后面,大家要繼續(xù)光顧我們的咖啡館哦!三誰說編寫程序不是一項藝術(shù)?那些命令與符號正像一幅工筆畫,一筆一畫產(chǎn)生出多少變幻莫測的結(jié)果。不過,光有骨架的工筆畫恐怕也無法成為絕世佳作,那么,今天就讓我們來為自己的作品添上最初的絢麗色彩吧。前言今天我們會為游戲添加動畫效果,這將會涉及到圖形處理,還有線程的基本
38、概念,這可是一項非常有意思的工作哦。本期源程序下載(點擊下載, 2kb, winzip壓縮)。上一期我們完成了游戲界面的設(shè)計,可是游戲的功能卻還十分單薄,比如說幾個人同時玩一個游戲,我們怎么比較誰玩得比較好呢,就算是自己一個人在玩,也得知道自己每次的成績啊。競技是游戲的主要動力之一,為了提高游戲的可玩性,我們得加入計時和計分的功能才行。 關(guān)于游戲的計時和計分功能,因為與我們swing的主題關(guān)系不大,這部分功能的實現(xiàn)我就不說了,如果大家感興趣的話可以參考一下我的源程序,里面有詳細(xì)的說明,在這里我們就只討論一下如何將顯示界面做得漂亮。jlabel和font還記得最開始的主界面是如何設(shè)計的嗎?我們將
39、界面分成了三個部分:系統(tǒng)菜單、游戲區(qū)、用戶交互區(qū)。用戶交互區(qū)的作用就是放置用戶的操作及反饋信息,計時和計分功能自然就是放在這里。首先我們可以放置一個文本控件,然后將這個控件的背景設(shè)置為界面的背景色或透明色。那么這個控件應(yīng)該是哪個呢?這個控件就是jlabel!jlabel的用法并不難,如果你能夠熟練使用jbutton的話,那么jlabel控件也會是小case了,讓我們一起來試試吧:jlabel score = new jlabel("307"); / 假設(shè)用戶當(dāng)前的分?jǐn)?shù)為307分actionpanel.add(score); 看看程序運行的結(jié)果,感覺如何?你也許會說:字太小了
40、,而且顏色也太暗了,看不太清楚。沒關(guān)系,這很容易解決: jlabel score = new jlabel("307");font font = new font("宋體", font.bold, 48);score.setforeground(color.yellow);score.setfont(font);actionpanel.add(score); 在上面的代碼中,我們首先創(chuàng)建了一個字體對象font,font構(gòu)造函數(shù)中3個參數(shù)的意義依次為:使用字體的名稱、字體的樣式(普通、粗體、斜體等)以及字體的大小等;然后,我們使用setforeground
41、來設(shè)計jlabel的前景色;最后,我們將jlabel的字體改為我們創(chuàng)建的字體?,F(xiàn)在我們再來看看程序運行的結(jié)果,是不是效果好多了(見圖1)?在游戲的過程中,只要時間或者分?jǐn)?shù)發(fā)生變化,我們就可以使用jlabel.settext(string s)來更新顯示。細(xì)心的朋友可能會發(fā)現(xiàn),在我們顯示時間和分?jǐn)?shù)的過程中,如果將字體設(shè)置得很大,顯示內(nèi)容雖然更容易看清,但視覺效果卻變得很差。這是因為字體越大,字體上的鋸齒就會越明顯,這是swing控件顯示文字的通病,遺憾的是暫時還沒有很有效的解決方法(見圖2)。善用graphics繪制圖形 在前面所有的章節(jié)中,我們都是使用現(xiàn)成的控件來滿足自己的需要,現(xiàn)成的控件雖然
42、使用方便,卻不能完全滿足我們的要求。這時我們就需要了解一下如何不使用控件來繪制圖形。 無論是swing控件也好,awt控件也好,他們都會有一個paint(graphics g)方法,一般情況下我們不會去理它的,然而,當(dāng)我們需要自己繪制圖形的時候,我們就不得不對這個方法有所了解。為了讓大家能夠接受自己繪制圖形的方法,我們還是從paint(graphics g)方法講起吧:paint(graphics g)方法將控件看作一張空白的紙,當(dāng)我們需要繪制圖形的時候,就可以使用graphics提供的一些基本方法來進(jìn)行繪制。為了方便大家理解,我們新建一個clock類來完成用戶時間的顯示,代碼如下:impor
43、t javax.swing.*;import java.awt.*;public class clockextends jpanel font font48 = new font("serif", font.bold, 48); this.setminimumsize(new dimension(156, 48); this.setpreferredsize(new dimension(156, 48); public void paint(graphics g) g
44、.setcolor(new color(111, 146, 212); g.clearrect(0, 0, this.getwidth(), this.getheight(); g.setcolor(color.yellow); g.setfont(font48); g.drawstring("307", 16, 40); 以上內(nèi)容應(yīng)該在我們新建的clock.java文件中,代碼并不難讀懂,大家可以自己查看文檔找到相關(guān)函
45、數(shù)的使用說明。然后,我們將原來程序中顯示時間的代碼部分改為: clock clock = new clock();actionpanel.add(clock);怎么樣,運行結(jié)果是否相同?雖然此時我們?nèi)匀粵]有消除文字上的鋸齒,不過已經(jīng)對swing中自己繪制圖形有了一個大致的了解。 隨心所欲的graphics2d 對于追求最佳視覺效果的我們,文字上的鋸齒顯示是不能容忍的。那么如何解決這個問題呢?既然這是swing控件顯示字體的通病,并且就連graphics也無能為力,看來,我們只有另辟蹊徑了。好在sun也意識到了這一點,因此在java中提供了graphics2d類來解決這種問題。下面,我們將依然使
46、用代碼來說明問題:public void paint(graphics g) graphics2d g2 = (graphics2d) g; dimension d = getsize(); g2.setbackground(new color(111, 146, 212); g2.clearrect(0, 0, d.width, d.height); g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_o
47、n); g2.setcolor(color.yellow); g2.setfont(font48); g2.drawstring("123", 16, 40);在上述的代碼中,我們將graphics對象轉(zhuǎn)換成graphics2d對象后,只需使用簡單的一句setrenderinghint()就完成了抗鋸齒的功能?,F(xiàn)在再來看看程序運行的效果,你還滿意嗎(見圖3)?讓文字活起來渴望無限,創(chuàng)造無限。如果能把計分和計時功能做成動畫,一定會更加生動。最簡單的做法就是讓數(shù)字依次變化,比如說時間,我們可以每隔1秒鐘就顯示一次數(shù)值,比如說上面的代碼,我們可
48、以簡單改為:for (int i = 1000; i < 2000; i+) g2.setbackground(new color(111, 146, 212); g2.clearrect(0, 0, d.width, d.height); / 清除當(dāng)前繪圖區(qū)域 g2.setcolor(color.yellow); g2.drawstring("" + i, 16, 40); try thread.sleep(1000); / 延時 1 秒鐘 catch
49、 (interruptedexception ex) 當(dāng)你執(zhí)行以上代碼以后便會知道,上面的代碼實際上有問題!我們使用了thread.sleep(1000)來讓程序進(jìn)行延時,每當(dāng)執(zhí)行thread.sleep()的時候,程序會進(jìn)入休眠狀態(tài),不響應(yīng)其他任何操作,就連顯示也不會更新,所以也就無從顯示動畫效果了。線程(thread)是惟一的解決方法,它可以讓程序在同一個時刻完成兩件或者兩件以上的事情。想讓你的程序支持線程,你可以選擇以下兩種方法的任意一種:public class clock extends threadpublic class clock implements runna
50、ble第一種方法要求你的程序繼承thread類,可是,如果繼承thread類之后,我們就沒有辦法再繼承jpanel了,因為java不支持多重繼承,如果不能繼承jpanel,那么paint(graphics g)也沒有用武之地了。而第二種方法只要求你實現(xiàn)runnable接口,而java允許一個類實現(xiàn)多個接口,所以我們應(yīng)該選擇第二種方法。首先需要把clock的聲明改成public class clock extends jpanel implements runnable,然后添加public void run() 上面是實現(xiàn)runnable接口的最基本的構(gòu)架。有的時候,為了讓線程能
51、夠具備開始和停止的功能,我們還得再擴(kuò)充一下。首先是線程的開始:public void start() starttime = system.currenttimemillis(); thread = new thread(this); thread.start(); 這里我們使用了system.currenttimemillis()來獲得開始時的系統(tǒng)時間,以便于以后計算用戶的游戲時間。然后是運行的過程:public void run() thread currentthread = thread.currentthread();
52、while (thread = currentthread) long time = system.currenttimemillis(); usedtime = time - starttime; try repaint(); thread.sleep(100); catch (interr
53、uptedexception ex) 第一句話thread currentthread = thread.currentthread();獲得系統(tǒng)當(dāng)前的線程,然后在循環(huán)中進(jìn)行判斷是否為當(dāng)前線程,這在在線程比較多而且線程之間的依賴性比較強的情況下非常有必要。repaint() 是awt/swing控件的方法,它會自動調(diào)用paint(graphics g)方法以便重新繪制顯示區(qū)域。最后,我們使用了thread.sleep(100)來讓程序每隔0.1秒運行一次。由于thread.sleep()方法會拋出異常,所以我們還需要捕獲異常。由于paint(
54、graphics g)每次顯示的內(nèi)容都會不同,因此,我們需要使用一個全局全量usedtime來記錄當(dāng)前的時間,在輸出的時候,我們應(yīng)寫成:g2.drawstring("time:" + gettime(), 16, 40); 其實gettime()方法是我們自己寫的,其作用是獲得用戶當(dāng)前使用的時間,并將時間格式化后傳出。最后,別忘記了在我們的主程序中調(diào)用start()方法,如:clock clock = new clock();clock.start();actionpanel.add(clock); 小方糖thread的前世今生最早的thread提供了thread.star
55、t() 、thread.pause()/thread.resume() 、thread.stop() 這三個方法來完成線程的開始、暫停和結(jié)束功能,然而,在后來的jdk中,sun卻不推薦使用pause()/resume()和stop()方法,理由是pause()和stop()方法在某些場合會讓程序進(jìn)入死鎖狀態(tài),因此,在你的程序中,假如你使用了thread的以上幾種方法,編譯的時候編譯器會告訴你"xxx.java": stop() in java.lang.thread has been deprecated at line xx, column xx這時候你就要注意了!小結(jié)今
56、天我們學(xué)習(xí)了使用graphics/graphics2d來滿足自己特殊的需要,再也不需要看控件的臉色了。同時,我們也知道了如何使用線程來讓程序同時進(jìn)行多個操作,并且結(jié)合了以上兩點來實現(xiàn)計時功能。但是我沒有在這里完成計分功能,就把這當(dāng)作留給大家的小小作業(yè)吧!四你有沒有經(jīng)歷過裝修?盡管它是件勞神費力的事,可現(xiàn)代人還是不遺余力地在裝修上花盡心思。畢竟,在這個視覺支配感觀的時代里,誰會嫌自己家太漂亮呢?今天,就讓我們秉著精益求精的完美主義精神,在上次已經(jīng)完成的游戲界面里再做一番細(xì)致的裝飾,將裝修進(jìn)行到底!jdialog增強型對話框窗口還記得我們最初做的“關(guān)于”功能嗎?雖然“關(guān)于”對話框能很好工作,但當(dāng)你
57、要寫比較長或者是比較復(fù)雜的內(nèi)容時,就會感覺到j(luò)optionpane有些捉襟見肘.讓我們用jdialog來制作漂亮的對話框吧!jdialog和jframe一樣同屬頂層容器控件,使用方法jpanel幾乎一樣。下面先來看看我們的第一個jdialog小程序吧:public class aboutdialog extends jdialog jlabel about = new jlabel("關(guān)于:這可是java寫的連連看哦!");public aboutdialog(jframe frame) this.settitle(&qu
58、ot;about"); this.setsize(320, 200); about.sethorizontalalignment(swingconstants.center); this.getcontentpane().add(about, borderlayout.center); this.show(); 然后將主程序中的“關(guān)于”部分的代碼修改如下:if (e.getsource() = about) new
59、aboutdialog(); return ; 現(xiàn)在運行看看,是不是大氣多了?當(dāng)然,現(xiàn)在的樣子仍稍嫌簡陋了一點,所以還得再接再勵。這里告訴大家一點小技巧:如果在程序中加入了jdialog.setdefaultlookandfeeldecorated(true),對話框窗口的顯示就會使用java的外觀風(fēng)格,會比原來的對話窗口漂亮得多!需要注意的是,當(dāng)使用了java觀感后,對話框右上角的關(guān)閉按鈕就不會顯示出來,因此得自己加上“關(guān)閉”按鈕及關(guān)閉窗口的事件處理。自己動手試試,你能做出和我一樣漂亮的對話框嗎(見圖1)?圖1:漂亮的對話框黃糖故事模態(tài)窗口和非模態(tài)窗口在windows中,我們常
60、常會接觸到模態(tài)窗口和非模態(tài)窗口。所謂模態(tài)窗口,就是指當(dāng)前窗口彈出時,只有關(guān)閉此窗口才能繼續(xù)進(jìn)行其它窗口的操作。非模態(tài)窗口則是即使不關(guān)閉當(dāng)前的窗口,也可以對后面的的窗口進(jìn)行操作。最典型的例子就是windows 中自帶的“記事本”軟件,“字體”功能就是模態(tài)窗口,而“查找”功能就是非模態(tài)窗口了。在jdialog中,我們可以用jdialog(frame owner, boolean modal)來指定對話框的模態(tài)或非模態(tài)狀態(tài)。在控件上使用html標(biāo)簽 大多數(shù)的swing控件可以顯示文字,對于這些控件,在一般情況下,只能使用單一字體、單一樣式、單一顏色來顯示。比如說,當(dāng)要在標(biāo)簽jlabel控件上顯示文件
61、時,我們會用到j(luò)label的setfont()、setforeground()等方法,并且代碼看起來會是這樣:label = new jlabel("a label");label.setfont(new font("serif", font.plain, 14);label.setforeground(new color(0xffffdd); 如果想在某段文字中使用不同的字體或顏色,其實可以使用html格式。在控件上使用html格式確實是一件令人興奮的事情,我們只需要簡單的將<html>標(biāo)記寫在控件中就行了,比如可以這樣創(chuàng)建一個jlabel:jlabel label = new jlabel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇州科技大學(xué)天平學(xué)院《樂理與視唱練耳四》2022-2023學(xué)年第一學(xué)期期末試卷
- 2024履約類保函擔(dān)保合同模板
- 皮膚移植-皮膚移植的分類(美容外科學(xué)課件)
- 2024高考志愿填報咨詢合同書
- 高一生物教學(xué)工作總結(jié)范例15篇
- 銷售總監(jiān)年終個人工作總結(jié)
- 蘇州科技大學(xué)天平學(xué)院《辦公室管理》2022-2023學(xué)年第一學(xué)期期末試卷
- 2023年慶陽市市直學(xué)校引進(jìn)高層次筆試真題
- 2024年房屋租賃項目提案報告
- 2024年電主軸精密零配件項目提案報告模板
- 2024高增長賽道洞察報告(小紅書平臺)
- 建筑施工企業(yè)(安全管理)安全生產(chǎn)管理人員安全生產(chǎn)考試參考題及答案
- 鍋爐應(yīng)急預(yù)案演練方案
- 《11~20各數(shù)的認(rèn)識》(教案)-2024-2025學(xué)年一年級上冊數(shù)學(xué)人教版
- 關(guān)于高技能人才培養(yǎng)問題的思考高技能人才培養(yǎng)方案
- 2024新信息科技四年級《第三單元 有趣的編碼應(yīng)用》大單元整體教學(xué)設(shè)計
- 中國航天發(fā)展史主題班會 課件
- 正向管理課件教學(xué)課件
- 第三單元鞏固練習(xí)-2024-2025學(xué)年統(tǒng)編版語文一年級上冊
- 教科版四年級上冊《制作我們的小樂器》作業(yè)設(shè)計
- 中小學(xué)四年級各種跑教案公開課教案教學(xué)設(shè)計課件案例測試練習(xí)卷題
評論
0/150
提交評論