張丹丹
摘要:在使用Java Swing創(chuàng)建登錄窗口的時(shí)候,涉及賬戶和密碼框的設(shè)置,本例討論使用JPasswordField()設(shè)置密碼框,然后采用事件監(jiān)聽(tīng)機(jī)制設(shè)置賬戶和密碼的登錄方式,在此過(guò)程中,使用匿名內(nèi)部類(lèi)創(chuàng)建監(jiān)聽(tīng)接口對(duì)象,并重寫(xiě)其中的方法,判斷賬號(hào)和密碼是否正確。本例還對(duì)登錄框的背景圖進(jìn)行設(shè)置,使用Jpanel作為容器,將圖片地址通過(guò)Toolkit.getDefaultToolkit().getImage提取,并重寫(xiě)該類(lèi)繪圖方法將圖片載入,并且通過(guò)主類(lèi)在背景圖片上添加登錄組件,如賬號(hào)輸入框和密碼輸入框等,實(shí)現(xiàn)登錄框的制作。
關(guān)鍵詞:JPasswordField();Toolkit.getDefaultToolkit().getImage;paintComponent(Graphics g);ActionListener()
中圖分類(lèi)號(hào):TP311 ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)31-0100-02
1 重寫(xiě)paintComponent方法創(chuàng)建背景
首先創(chuàng)建背景圖,這里單獨(dú)創(chuàng)建一個(gè)類(lèi),因?yàn)榭紤]將圖片載入JPanel,然后重寫(xiě)其中的paintComponent(),因此本例取名panel類(lèi)。在網(wǎng)上下載背景圖片,本例格式為jpg,將其放入D盤(pán)根目錄下,并將其路徑保存至Sring對(duì)象中,如String url="D:\\bj.jpg",在該類(lèi)構(gòu)造函數(shù)中,通過(guò)上述保存的圖片鏈接獲取圖片,具體使用Toolkit.getDefaultToolkit().getImage(url)來(lái)實(shí)現(xiàn),因?yàn)門(mén)oolkit是抽象類(lèi),它調(diào)用了靜態(tài)函數(shù)getDefaultToolkit()返回一個(gè)實(shí)例,然后再調(diào)用getImage(url)來(lái)獲取圖片。獲取圖片后,就可以重寫(xiě)paintComponent()實(shí)現(xiàn)載入背景圖,該方法的參數(shù)為Graphics類(lèi),該類(lèi)即為幾何圖形的繪制類(lèi),如繪制矩形、圓形、三角形等;在重寫(xiě)過(guò)程中可以先調(diào)用父類(lèi)的繪制組件方法進(jìn)行一次背景色的重繪,在這里可以免去本句函數(shù)(super.paintComponent(g)),因?yàn)橄旅鎸⒅貙?xiě)該方法,關(guān)鍵使用g.drawImage(img, x, y, observer)載入圖片,從上述調(diào)用可以看出該方法屬于Graphics類(lèi),它包含六個(gè)構(gòu)造函數(shù),本例中使用g.drawImage(img, x, y, observer),x 和y代表圖片左上角的坐標(biāo)軸,observer為繪制的容器,此例可以為null或this。
2 使用內(nèi)部類(lèi)添加登錄框
2.1界面設(shè)置
登錄框?yàn)橹黝?lèi),此例為基于JFrame類(lèi)的對(duì)話框,取名keytest類(lèi)。在該類(lèi)構(gòu)造函數(shù)中,首先將該主框架類(lèi)設(shè)置為容器,然后創(chuàng)建上述panel類(lèi)的實(shí)例對(duì)象,注意,剛剛創(chuàng)建的容器為頂層容器,在這個(gè)頂層容器中將panel類(lèi)的實(shí)例添加進(jìn)去;同時(shí)第一大段論述panel類(lèi)是基于JPanel類(lèi)的,因?yàn)镴panel面板繼承了java.awt.Container類(lèi),因此它本身屬于容器,它被頂級(jí)容器添加后就成為二級(jí)容器,然后再使用二級(jí)容器(即panel類(lèi)實(shí)例)去添加密碼框等組件,如果直接使用頂層容器去添加組件,就無(wú)法產(chǎn)生圖片背景。在panel面板添加組件時(shí),使用了絕對(duì)布局,代碼為bg.setLayout(null),之后在添加過(guò)程中可以使用setBounds(x, y, width, height)設(shè)置每個(gè)組件的具體位置。登錄界面設(shè)有賬戶輸入框和密碼輸入框,賬戶輸入框使用new JTextField()產(chǎn)生一個(gè)實(shí)例zh,密碼輸入框使用new JPasswordField()產(chǎn)生實(shí)例,密碼框與文本框的定義和使用方法類(lèi)似,但是密碼框輸入字符可以使用回顯字符,可以起到加密作用,也就是隱藏密碼的顯示或者說(shuō)以其他字符代替密碼的顯示,可以使用password.setEchoChar('*')來(lái)顯示回顯字符,本例使用“*”號(hào)。本段代碼如圖1:
2.2登錄按鈕設(shè)置
開(kāi)始創(chuàng)建登錄按鈕。先考慮我們?cè)邳c(diǎn)擊按鈕,或點(diǎn)擊下拉菜單時(shí),即是這類(lèi)組件調(diào)用了相應(yīng)的動(dòng)作方法,這些方法如:addActionListener(),removeActionListener(),而這些方法的參數(shù)即是各類(lèi)事件對(duì)象,這些事件對(duì)象所屬的類(lèi)必須實(shí)現(xiàn)特定的接口,同時(shí)要實(shí)現(xiàn)接口中的方法,監(jiān)聽(tīng)接口如:ActionListener。通常情況下,可以先通過(guò)組件對(duì)象調(diào)用監(jiān)聽(tīng)器的方法,然后再創(chuàng)建一個(gè)繼承監(jiān)聽(tīng)接口的內(nèi)部類(lèi),接著根據(jù)實(shí)際要求重寫(xiě)內(nèi)部類(lèi)中的方法。此例中,我們創(chuàng)建了匿名內(nèi)部類(lèi),即將監(jiān)聽(tīng)接口對(duì)象作為參數(shù)傳給監(jiān)聽(tīng)器的方法,代碼如:button.addActionListener(new ActionListener(){})。接著重寫(xiě)該接口的public void actionPerformed(ActionEvent e),注意方法的參數(shù)為ActionEvent e,即動(dòng)作事件類(lèi)對(duì)象,方法體中,思路為先提取賬戶框和密碼框中的文本,提取賬戶文本框中文本使用getText()即可,提取的類(lèi)型為字符串;提取密碼框中文本,如使用getText(),eclipse會(huì)在該代碼上劃?rùn)M線,實(shí)際提示安全性問(wèn)題,因?yàn)間etText()提取的是字符串,而字符串所申請(qǐng)的內(nèi)存區(qū)域是固定不變的,一旦創(chuàng)建不能改變,因?yàn)閖ava字符串常量池等原因,會(huì)導(dǎo)致密碼泄露,這個(gè)方法在查詢API時(shí),也提示已過(guò)期;使用getPassword():char[],顧名思義,處理的是密碼文本域,可以看出,返回的是char數(shù)組,也正因?yàn)槿绱耍膃quals方法采用的是比較運(yùn)算符==,而==是比較的地址,因此安全性更高。因?yàn)樾枰~號(hào)和密碼都要正確,因此,需定義兩個(gè)字符串對(duì)象,將賬號(hào)和密碼的獲取值分別傳給這兩個(gè)字符串,在此需要注意,上面論述中提到getPassword():char[]返回的是char[]數(shù)組,因此使用靜態(tài)函數(shù)String.valueOf(char[] data)將其轉(zhuǎn)換成字符串,同時(shí)還有Integer.valueof(),valueof()也就是轉(zhuǎn)換并返回需要的數(shù)據(jù)類(lèi)型。最后,使用if()來(lái)判斷輸入的賬戶和密碼是否均正確,使用邏輯與&&來(lái)鏈接兩個(gè)判斷,如:if(z.equals("czfy")&&key.equals("hello")),最后讓登錄成功框彈出,即建立該對(duì)話框類(lèi)對(duì)象并設(shè)置可見(jiàn),如:ok j=new ok();j.setVisible(true)。該段主要代碼見(jiàn)圖2,登錄界面見(jiàn)圖3:
參考文獻(xiàn):
[1] 陳猛.基于Java的購(gòu)物網(wǎng)站設(shè)計(jì)與開(kāi)發(fā)[J].農(nóng)家參謀,2020(8):200.
[2] 陳益全.基于創(chuàng)新型人才培養(yǎng)模式的《Java Web開(kāi)發(fā)》教學(xué)設(shè)計(jì)[J].湖北開(kāi)放職業(yè)學(xué)院學(xué)報(bào),2020,33(4):5-7.
[3] 官亞芬.計(jì)算機(jī)軟件開(kāi)發(fā)中JAVA編程語(yǔ)言及其實(shí)際應(yīng)用[J].中國(guó)新通信,2020,22(4):98-99.
[4] 楊偉凡.基于Java技術(shù)平臺(tái)的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].衛(wèi)星電視與寬帶多媒體,2020(3):99-100.
[5] 張振超,吳杰,陳序蓬.淺談Java中Mysql數(shù)據(jù)庫(kù)的連接與操作[J].信息記錄材料,2020,21(2):144-145.
[6] 蔣玉婷.基于JAVA的教育教學(xué)綜合平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)[J].教育現(xiàn)代化,2018,5(47):214-215.
[7] 陳磊,朱接文,張新萍.基于Java Web課程的啟發(fā)教學(xué)研究[J].湖南郵電職業(yè)技術(shù)學(xué)院學(xué)報(bào),2018,17(4):129-132.
[8] 王蘊(yùn)森.Java技術(shù)在圖像處理中的應(yīng)用[J].中國(guó)新通信,2018,20(23):118.
【通聯(lián)編輯:王力】