王春輝 孫陽(yáng) 黃耀燁 楊靈軍 邱悅章 張文健 徐夢(mèng)竹
摘? 要: 為了讓研究團(tuán)隊(duì)在內(nèi)部更加方便地進(jìn)行實(shí)驗(yàn)數(shù)據(jù)的輸入、共享、導(dǎo)出等處理,在Windows 10操作系統(tǒng)下利用Java語(yǔ)言設(shè)計(jì)開發(fā)出一款數(shù)據(jù)管理類桌面應(yīng)用程序軟件。該軟件分為登陸系統(tǒng)和功能系統(tǒng)兩部分,滿足了用戶團(tuán)隊(duì)的基本需求,為他們對(duì)西北干旱荒漠化地區(qū)的區(qū)域環(huán)境研究提供了一定的技術(shù)支持。
關(guān)鍵詞: 數(shù)據(jù)處理;桌面應(yīng)用程序;Java
中圖分類號(hào): TP317? ? 文獻(xiàn)標(biāo)識(shí)碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.10.022
本文著錄格式:王春輝,孫陽(yáng),黃耀燁,等. 基于java的荒漠治理數(shù)據(jù)管理軟件的設(shè)計(jì)與開發(fā)[J]. 軟件,2020,41(10):9294+125
【Abstract】: In order to facilitate the research team to input, share, export and other processing of experimental data, a data management desktop application software is designed and developed by using java language under Windows 10 operating system. The software is divided into two parts: landing system and functional system, which meet the basic needs of the user team and provide some technical support for them to study the regional environment in the arid and desertification area of Northwest China.
【Key words】: Data processing; Desktop applications; Java
0? 引言
西北干旱荒漠區(qū)位于國(guó)家生態(tài)安全格局“兩屏三帶”的北方防沙帶,是國(guó)家“一帶一路”的重點(diǎn)建設(shè)區(qū)域,由于該區(qū)干旱風(fēng)大、植被退化、土地沙化嚴(yán)重,所以生態(tài)系統(tǒng)極其脆弱。為研究西北干旱荒漠區(qū)煤炭開發(fā)對(duì)區(qū)域生態(tài)影響規(guī)律,構(gòu)建礦區(qū)受損生態(tài)系統(tǒng)恢復(fù)與重建技術(shù)體系,研究團(tuán)隊(duì)一直在當(dāng)?shù)厥占瘮?shù)據(jù)并進(jìn)行分析。本軟件供科研團(tuán)隊(duì)內(nèi)部使用,研究人員將使用科研儀器測(cè)得的數(shù)據(jù)進(jìn)行輸入、更新、管理、共享,實(shí)現(xiàn)對(duì)研究區(qū)域環(huán)境的檢測(cè),從而為改善當(dāng)?shù)丨h(huán)境,提高生態(tài)建設(shè)做出貢獻(xiàn)。
1? 開發(fā)技術(shù)概述
1.1? 編程語(yǔ)言與開發(fā)環(huán)境
Java語(yǔ)言是一門基礎(chǔ)的編程語(yǔ)言,具有面向?qū)ο蟆⑵脚_(tái)獨(dú)立等多個(gè)優(yōu)勢(shì),在軟件開發(fā)中得到了廣泛的應(yīng)用。Java提供了豐富的工具包,方便了開發(fā)者的使用,增強(qiáng)了功能的設(shè)計(jì)。本軟件采用Windows 10操作系統(tǒng)下的Eclipse作為開發(fā)平臺(tái),開發(fā)環(huán)境為JDK1.8。
1.2? 開發(fā)的關(guān)鍵技術(shù)
(1)JavaFx
JavaFX是一個(gè)功能強(qiáng)大的圖形和多媒體處理工具包,便于開發(fā)者來(lái)設(shè)計(jì)、創(chuàng)建、測(cè)試、調(diào)試和部署桌面應(yīng)用程序。JavaFX的UI設(shè)計(jì)功能強(qiáng)大,可以通過(guò)純Java代碼進(jìn)行UI界面的設(shè)計(jì),也可以通過(guò)FXML語(yǔ)言進(jìn)行設(shè)計(jì),設(shè)計(jì)完成后編譯為后綴為“fxml”文件供后端調(diào)用。FXML是基于XML的一種聲明性標(biāo)記語(yǔ)言,用來(lái)定義應(yīng)用的用戶口,后端通過(guò)聲明相應(yīng)控件的用戶口與FXML文件中的控件進(jìn)行配對(duì),完成調(diào)用,大大增加了UI界面設(shè)計(jì)的方便性,簡(jiǎn)潔性和可視性[1]。
(2)Java Swing
Swing是一個(gè)Java設(shè)計(jì)的GUI工具包,是Java基礎(chǔ)類的一部分,提供了許多優(yōu)質(zhì)的屏幕顯示器件,如表、分割窗格等[2]。Swing使用純Java代碼寫成,其組件采用MVC的設(shè)計(jì),實(shí)現(xiàn)了GUI組件的顯示邏輯和數(shù)據(jù)邏輯的分離,提供了更多的靈活性。
(3)Java POI
POI是“Poor Obfuscation Implementation”的首字母縮寫,意為“簡(jiǎn)潔版的模糊實(shí)現(xiàn)”。它是用Java語(yǔ)言編寫的免費(fèi)開源的跨平臺(tái)的 Java API,提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫的功能,允許開發(fā)成員使用Java程序創(chuàng)建、修改、顯示和設(shè)計(jì)Microsoft Office文件[3]。
(4)MySQL數(shù)據(jù)庫(kù)
MySQL是一個(gè)可用于各種流行操作系統(tǒng)平臺(tái)的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),它具有客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫(kù)管理系統(tǒng),使用結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行數(shù)據(jù)庫(kù)管理[4]。本軟件的開發(fā)初期,使用本地MySQL進(jìn)行軟件數(shù)據(jù)管理的調(diào)試,軟件開發(fā)成功后,進(jìn)行云端數(shù)據(jù)庫(kù)的連接,使數(shù)據(jù)文件實(shí)現(xiàn)聯(lián)網(wǎng)共享。
2? 軟件設(shè)計(jì)實(shí)現(xiàn)
本軟件是一款面向科研團(tuán)隊(duì)內(nèi)部使用的數(shù)據(jù)管理軟件,分為登陸系統(tǒng)和功能系統(tǒng)兩部分,軟件流程圖如圖1所示。登陸系統(tǒng)中,用戶注冊(cè)成功后,即可登陸功能界面,若用戶忘記密碼,則可以通過(guò)注冊(cè)郵箱和注冊(cè)用戶名找回密碼。用戶分為兩類,一類為學(xué)生,主要負(fù)責(zé)數(shù)據(jù)的輸入與更新;另一類為老師,老師通過(guò)負(fù)責(zé)課題的不同進(jìn)行分類,主要負(fù)責(zé)數(shù)據(jù)文件的管理。功能系統(tǒng)中,用戶登陸成功進(jìn)入功能頁(yè)面后,學(xué)生可以根據(jù)不同的課題進(jìn)行相應(yīng)的數(shù)據(jù)的輸入和導(dǎo)出本地文件,并且可以查看自己輸入保存的數(shù)據(jù)文件和對(duì)自己已經(jīng)輸入的數(shù)據(jù)文件進(jìn)行更新。老師可以查看自己負(fù)責(zé)課題下的所有數(shù)據(jù)文件,并可以進(jìn)行數(shù)據(jù)的更新,數(shù)據(jù)文件的刪除和本地導(dǎo)出。
2.1? 登陸系統(tǒng)
登陸系統(tǒng)分為三個(gè)部分,分別是用戶注冊(cè)、用戶登陸、密碼找回。三個(gè)子功能界面可以相互進(jìn)行跳轉(zhuǎn)。
(1)用戶注冊(cè)
用戶注冊(cè)需要填寫以下信息:用戶名、密碼、確認(rèn)密碼、郵箱和身份。若注冊(cè)用戶的身份為老師,則需要對(duì)自己負(fù)責(zé)的課題進(jìn)行選擇,若為學(xué)生,則不需要。若注冊(cè)信息出現(xiàn)不符合要求的填寫,如:用戶名重復(fù)、兩次輸入密碼不一致等,會(huì)進(jìn)行相應(yīng)的提示。
(2)用戶登陸
用戶登陸需要填寫以下信息:用戶名和密碼。通過(guò)對(duì)已經(jīng)注冊(cè)的信息進(jìn)行檢索,當(dāng)用戶名和密碼一致時(shí),用戶登陸成功,同時(shí)把登陸成功的用戶名傳遞到功能系統(tǒng)的主界面進(jìn)行調(diào)用。當(dāng)用戶名和密碼出現(xiàn)錯(cuò)誤時(shí),進(jìn)行相應(yīng)的提示。界面之間的傳值使用了HashMap,首先在類中定義一個(gè)HashMap表用于存儲(chǔ)用戶名。當(dāng)?shù)顷懶畔o(wú)誤時(shí),將相應(yīng)的用戶名寫入表中,并在功能系統(tǒng)讀出保存的用戶名,即實(shí)現(xiàn)了界面之間值的傳遞。
(3)密碼找回
當(dāng)用戶忘記密碼時(shí),可以通過(guò)用戶名和郵箱找回密碼,并進(jìn)行相應(yīng)的提示。若用戶名和郵箱也忘記時(shí),可以通過(guò)管理員登陸數(shù)據(jù)庫(kù)后臺(tái)進(jìn)行查看。
2.2? 功能系統(tǒng)
功能系統(tǒng)中,根據(jù)用戶身份的不同,用戶在數(shù)據(jù)查看和功能使用上會(huì)有不同的權(quán)限。
(1)功能系統(tǒng)主界面
主界面起導(dǎo)航作用,其界面如圖2所示。在界面的上半部分,輸入你要?jiǎng)?chuàng)建的數(shù)據(jù)文件的文件名,輸入數(shù)據(jù)文件擬定的行數(shù)和列數(shù)(行數(shù)和列數(shù)在數(shù)據(jù)文件輸入界面可進(jìn)行修改),選定數(shù)據(jù)文件屬于的課題,點(diǎn)擊“創(chuàng)建表單”即可完成創(chuàng)建并跳轉(zhuǎn)到數(shù)據(jù)輸入界面。在界面的下半部分,在文本框輸入數(shù)據(jù)文件名稱即可查看相應(yīng)的數(shù)據(jù)。首先點(diǎn)擊“查看數(shù)據(jù)文件”,界面右方的“Filenameob”表中會(huì)出現(xiàn)你有權(quán)查看的數(shù)據(jù)文件,然后將數(shù)據(jù)文件名填寫到文本框中,點(diǎn)擊“顯示數(shù)據(jù)文件”,即可看到相應(yīng)的數(shù)據(jù)。
(2)數(shù)據(jù)文件創(chuàng)建
創(chuàng)建文件成功后,點(diǎn)擊“數(shù)據(jù)上傳”將輸入的數(shù)據(jù)上傳到數(shù)據(jù)庫(kù),點(diǎn)擊“數(shù)據(jù)導(dǎo)出”后可以將數(shù)據(jù)以“xls”為后綴的文件保存到本地。點(diǎn)擊“增加一行”與“增加一列”,表格分別增加一行與一列。點(diǎn)擊“刪除該行”,表格將刪除選定的行。點(diǎn)擊“刪除該列”,表格將刪除最后一列。
(3)數(shù)據(jù)文件更新
查看數(shù)據(jù)文件時(shí),可實(shí)現(xiàn)“數(shù)據(jù)文件創(chuàng)建”中所有的操作,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)的更新。如果你是學(xué)生用戶,在對(duì)數(shù)據(jù)進(jìn)行添加、刪除、修改等處理后,點(diǎn)擊“數(shù)據(jù)更新”即實(shí)現(xiàn)對(duì)數(shù)據(jù)文件的更新。如果你是老師用戶,在學(xué)生用戶可進(jìn)行操作的基礎(chǔ)上上,點(diǎn)擊“刪除該文件”還可以實(shí)現(xiàn)對(duì)該數(shù)據(jù)文件的刪除。數(shù)據(jù)文件查看界面如圖3。
3? 開發(fā)難點(diǎn)總結(jié)
在項(xiàng)目策劃過(guò)程中,擬采用JavaFX進(jìn)行所有界面的編寫和后端的開發(fā)。項(xiàng)目開發(fā)過(guò)程中,發(fā)現(xiàn)JavaFX對(duì)于表格的創(chuàng)建不如Java Swing更適合本軟件的開發(fā),其不同在于有關(guān)數(shù)據(jù)表單的處理。JavaFX在數(shù)據(jù)顯示方面更具方便性,但不便于創(chuàng)建空表單和數(shù)據(jù)輸入。Java Swing可以使用Table控件的相關(guān)類動(dòng)態(tài)地創(chuàng)建空表單和顯示數(shù)據(jù),并可以在空表格中自由地輸入數(shù)據(jù),更加適合本軟件功能界面的開發(fā)。
3.1? 數(shù)據(jù)本地導(dǎo)出
開發(fā)過(guò)程中,數(shù)據(jù)本地導(dǎo)出使用了兩種方法。第一種是使用字符緩沖輸出流BufferedWrite進(jìn)行寫操作,首先創(chuàng)建一個(gè)字符緩沖輸出流對(duì)象,然后通過(guò)“write”方法將表格中的數(shù)據(jù)寫到Excel表中,代碼調(diào)試中,發(fā)現(xiàn)寫出的文件為空文件,故放棄該種方法。第二種是使用POI,POI實(shí)現(xiàn)了其對(duì)象與Excel中元素的一一對(duì)應(yīng),“HSSFWorkbook”對(duì)應(yīng)于Ecxel文件,“HSSFSheet”對(duì)應(yīng)于Ecxel文件中的一張表,“HSSFRow”對(duì)應(yīng)于表中的列,“HSSFCell”對(duì)應(yīng)于表中的單元格。依次創(chuàng)建好相應(yīng)的對(duì)象后,將表格中的數(shù)據(jù)通過(guò)“setCellValue”寫入即可。除此以外,POI還提供了設(shè)置表格樣式的方法,功能更加豐富[5]。 數(shù)據(jù)文件導(dǎo)出如圖4所示。
3.2? 動(dòng)態(tài)表格的創(chuàng)建
JavaFX創(chuàng)建一個(gè)表格的方式有兩種,一是通過(guò)FXML語(yǔ)言,創(chuàng)建 “TableView”控件,在對(duì)應(yīng)的Controller類實(shí)現(xiàn)控件接口對(duì)接并且寫入數(shù)據(jù);二是通過(guò)純Java代碼,先編寫一個(gè)表格控件,再填充數(shù)據(jù)。其缺點(diǎn)主要有三個(gè)方面:(1)若表格中不含有數(shù)據(jù),則不會(huì)顯示任何單元格。(2)只能通過(guò)定義表頭來(lái)確定相應(yīng)的列數(shù),表格的行數(shù)會(huì)隨著封裝“TableView”的窗口的大小變化而變化。(3)無(wú)法隨機(jī)地在任意單元格進(jìn)行數(shù)據(jù)輸入。而Java Swing中在創(chuàng)建表格方面,實(shí)現(xiàn)了上述需求。首先創(chuàng)建一個(gè)Jtable對(duì)象,然后給創(chuàng)建的Jtable對(duì)象綁定一個(gè)DefaultTableModel類。DefaultTableModel中提供了豐富的表格處理方法,可設(shè)置表格的行數(shù)和列數(shù),簡(jiǎn)單方便地實(shí)現(xiàn)了動(dòng)態(tài)表格的創(chuàng)建,實(shí)現(xiàn)了基本需求。如果要進(jìn)行數(shù)據(jù)顯示,則需要在行數(shù)和列數(shù)的基礎(chǔ)上,創(chuàng)建兩個(gè)相應(yīng)大小的數(shù)據(jù)數(shù)組匹配表格的表頭和數(shù)據(jù)。在數(shù)組中添加相應(yīng)的數(shù)據(jù),將數(shù)組綁定在創(chuàng)建DefaultTableModel對(duì)象中,即可實(shí)現(xiàn)數(shù)據(jù)可視化。
3.3? 動(dòng)態(tài)量數(shù)據(jù)的上傳
本軟件使用的是MySql數(shù)據(jù)庫(kù),在數(shù)據(jù)上傳及數(shù)據(jù)更新時(shí)遇到兩個(gè)主要問(wèn)題。一是數(shù)據(jù)表的創(chuàng)建,因?yàn)榱袛?shù)是可以改變的,所以在數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表時(shí)無(wú)法通過(guò)一條通用語(yǔ)句實(shí)現(xiàn)。解決方式是先使用CREATE TABLE語(yǔ)句創(chuàng)建一個(gè)只有一列的數(shù)據(jù)表,然后根據(jù)表格的列數(shù)循環(huán)使用ALTER語(yǔ)句進(jìn)行數(shù)據(jù)表的更新,每一次更新即添加一列,直到創(chuàng)建好相應(yīng)的數(shù)據(jù)表。二是數(shù)據(jù)的上傳,向MySql插入數(shù)據(jù)通常采用INSERT語(yǔ)句,但I(xiàn)NSERT語(yǔ)句只能一行一行地插入數(shù)據(jù)且每一行的數(shù)據(jù)是固定的。當(dāng)表格的列數(shù)改變時(shí),INSERT語(yǔ)句中的數(shù)據(jù)個(gè)數(shù)不能匹配,會(huì)出現(xiàn)新增數(shù)據(jù)列的數(shù)據(jù)在數(shù)據(jù)庫(kù)為空的情況。解決辦法是使用ResultSet結(jié)果集,ResultSet向數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí)也是一行一行進(jìn)行插入,與INSERT方法不同的是,ResuleSet可使用updateString方法對(duì)每一行中數(shù)據(jù)一個(gè)一個(gè)地進(jìn)行寫入而非一次性寫入,實(shí)現(xiàn)了每一行數(shù)據(jù)量動(dòng)態(tài)地改變[6]。在一行的數(shù)據(jù)寫入完成后即插入本行數(shù)據(jù)到數(shù)據(jù)表,再進(jìn)行下一行數(shù)據(jù)的更新,直到寫入所有數(shù)據(jù)。
4? 結(jié)束語(yǔ)
本軟件較好地實(shí)現(xiàn)了數(shù)據(jù)輸入、數(shù)據(jù)共享和數(shù)據(jù)導(dǎo)出等功能,滿足了用戶的基本需求。但還需要進(jìn)一步的改進(jìn)和完善:一是數(shù)據(jù)輸入方面,在手動(dòng)輸入的基礎(chǔ)上實(shí)現(xiàn)數(shù)據(jù)文件的導(dǎo)入;二是該軟件僅支持在Windows 64位系統(tǒng)上運(yùn)行,較為單一。下面將進(jìn)行相應(yīng)的完善,使軟件的受眾和應(yīng)用更廣[7]。
參考文獻(xiàn)
[1]郭強(qiáng). JavaFX中列表視圖的應(yīng)用與研究[J]. 數(shù)字技術(shù)與應(yīng)用, 2018, 36(1): 106+108.
[2]葛萌, 歐陽(yáng)宏基. JTable組件在Swing開發(fā)中的應(yīng)用研究[J]. 信息技術(shù), 2015(11): 80-82+86.
[3]劉新磊, 王琪琛, 邱天昱. 基于Java+POI的教師監(jiān)考任務(wù)信息檢索系統(tǒng)設(shè)計(jì)[J]. 電腦編程技巧與維護(hù), 2018(12): 102-104.
[4]肖奇軍, 鄭達(dá)成, 方楷生, 等. 基于Java的家電維修應(yīng)用軟件設(shè)計(jì)和實(shí)現(xiàn)[J]. 機(jī)電工程技術(shù), 2019, 48(11): 138-140.
[5]朱文君, 黃國(guó)權(quán). 基于Java反射機(jī)制的POI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入/導(dǎo)出[J]. 計(jì)算機(jī)時(shí)代, 2015(1): 38-39+47.
[6]王海文. 基于Java數(shù)組的JDBC ResultSet結(jié)果集處理的研究[J]. 硅谷, 2011(24): 103-104.
[7]張婉貞, 吳萃, 肖佳宇. 基于Java 程序的現(xiàn)代城市地鐵查詢系統(tǒng)設(shè)計(jì)[J]. 軟件, 2016, 37(3): 47-50.