国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

JTable內(nèi)中文輸入的一種解決方案

2009-09-30 05:54:42王占中,張涵
電腦知識(shí)與技術(shù) 2009年34期
關(guān)鍵詞:機(jī)器人

王占中,張涵

摘要:為了能在JTable表格中方便地輸入中文數(shù)據(jù),創(chuàng)造性地研究出某些特殊的能在中文輸入法下直接啟動(dòng)數(shù)據(jù)輸入的鍵盤(pán)鍵位。利用JAVA中機(jī)器人技術(shù)完成特定的動(dòng)作,提高了用戶輸入的效率,也豐富了JAVA機(jī)器人技術(shù)的應(yīng)用。

關(guān)鍵詞:JAVA;JTable;機(jī)器人;事件監(jiān)視器

中圖分類號(hào):TP312文獻(xiàn)標(biāo)示碼:A文章編號(hào):1009-3044(2009)34-9859-02

A Solution to Input Chinese Data in JTable

WANG Zhan-zhong, ZHANG Han

(Department of Computer Science and Information Engineering, Anyang Institute of Technology, Anyang 455000, China)

Abstract: In order to input conveniently Chinese Data in JTable, Some special keys of keyboard are found creatively, which can make sure users entering Chinese data without inputting anything. By JAVA Robot class, the program may execute automatically special tasks ,which improves users' work efficiency and expands the Robots application.

Key words: JAVA; JTable; robot; eventlistener

在用JAVA開(kāi)發(fā)一個(gè)應(yīng)用軟件時(shí),使用JTable作為輸入界面接受用戶輸入的數(shù)據(jù)。用戶在使用過(guò)程中發(fā)現(xiàn):用英文輸入法時(shí)非常方便,只要用制表鍵或方向箭頭鍵移到要輸入的表格位置,直接輸入即可;而用中文輸入法時(shí),用上面的控制鍵移到要輸入的位置時(shí)卻無(wú)法直接輸入數(shù)據(jù),需要用戶用鼠標(biāo)點(diǎn)擊相應(yīng)位置一下才可以輸入數(shù)據(jù),給用戶帶來(lái)諸多不便。于是尋求解決的方法,愿將方法尋找的過(guò)程以及最后的結(jié)果奉獻(xiàn)出來(lái),供方家們指正。如有尺寸可取,不勝欣慰。

1 方案的尋求過(guò)程

初遇此問(wèn)題,計(jì)劃從JTable本身尋求解決方案。力圖找到JTable對(duì)英文方式、中文方式的區(qū)別。經(jīng)過(guò)研究JTable的文檔資料,未能發(fā)現(xiàn)其對(duì)中英文方式的不同論述,這方面的努力未能成功。

既然在中文輸入法下,每到一個(gè)表格,都需要而外加一個(gè)鼠標(biāo)點(diǎn)擊的動(dòng)作,那么不妨由程序自動(dòng)完成這一動(dòng)作。這是解決這一問(wèn)題最容易想到的方案,也是一種常規(guī)的方案。這一方案的問(wèn)題是鼠標(biāo)的位置確定需要較為復(fù)雜的計(jì)算。對(duì)不同的表,表格單元的位置是不一樣的。既使同一表格顯示形式的變化,也會(huì)影響表格單元的位置。當(dāng)然JTable提供了從鼠標(biāo)坐標(biāo)到表格單元格位置的換算(rowAtPoint(Point p),columnAtPoint(Point p)),但沒(méi)有提供相反的運(yùn)算(確切地講是沒(méi)有提供直接的運(yùn)算,其實(shí)可以運(yùn)用JTable.getRowHeight(int row)和TableColumn.getWidth()計(jì)算)。所以計(jì)算特定的表格單元所含的點(diǎn)的坐標(biāo)還是要費(fèi)一些周折,尤其是各個(gè)行的高度、列的寬度可以各不相同。于是放棄了這一方面的努力。

在舍棄了前面兩種方案之后,對(duì)中英文輸入法進(jìn)行了比較深入的研究與實(shí)踐。力圖找到在中英文輸入法中表現(xiàn)完全一致的鍵位。也就是說(shuō),這些鍵位是不區(qū)分中文輸入法和英文輸入法的。換句話講,這些鍵位是中文輸入法中存在的少有的英文字符。輸入這種鍵,雖在中文方式下,卻可以直接啟動(dòng)輸入過(guò)程,接著輸入中文或英文都是可以的。實(shí)踐證明在微軟中文半角的情況下,如下幾個(gè)鍵和英文輸入法表現(xiàn)一致:BackSpace(回格)、Space(空格)、/(斜杠)、-(減號(hào))、=(等號(hào))。進(jìn)一步考慮對(duì)輸入內(nèi)容的影響:這幾個(gè)鍵中BackSpace(回格)鍵有可能使單元的內(nèi)容減少一個(gè)字符,其余鍵都會(huì)使輸入的內(nèi)容有所增加。如使用Space(空格)真正的內(nèi)容多一個(gè)空格,其它也一樣。于是采取的方案是:先加一個(gè)Space(空格),然后加一個(gè)BackSpace(回格),內(nèi)容不變,效果相當(dāng)好。

2 涉及到的關(guān)鍵技術(shù)

實(shí)施本方案主要使用兩種技術(shù):事件監(jiān)視器與機(jī)器人。

2.1 事件監(jiān)視器技術(shù)

本來(lái)事件監(jiān)視器技術(shù)是JAVA技術(shù)中通用的處理技術(shù),沒(méi)有論述的必要。但是將監(jiān)視器放在什么位置還是值得斟酌的。程序的基本結(jié)構(gòu)是這樣的:在某JInternalFrame窗口內(nèi)部放置兩個(gè)JScrollPane面板,在其中一個(gè)面板內(nèi)放置JTable組件。JInternalFrame窗口本身只是一個(gè)框架,在此放置監(jiān)視器是不合適的,況且也沒(méi)有添加監(jiān)視器的方法,考慮到面板在此屬于比較固定的組件,于是計(jì)劃在JScrollPane面板上放置監(jiān)視器。這里出現(xiàn)一個(gè)問(wèn)題:在默認(rèn)情況下,一個(gè)JScrollPane面板得不到鍵盤(pán)輸入,即不能接受任何鍵盤(pán)事件。如想要使用必須要重載其isFocusTraversable方法,使其返回true[1]。這樣比較繁瑣。最后確定將監(jiān)視器放置在JTable組件上。本來(lái)就是為JTable輸入的問(wèn)題,順理成章。收到了預(yù)期的效果。

本文用到的監(jiān)視器兩種類型:鍵盤(pán)監(jiān)視器和鼠標(biāo)監(jiān)視器。前者解決除首次輸入的所有位置的輸入問(wèn)題,后者自然是解決首次輸入問(wèn)題。

2.2 AWT機(jī)器人技術(shù)

Robot類是自JAVA 2的1.3版本添加的,可以利用該類將擊鍵和鼠標(biāo)點(diǎn)擊發(fā)送到任何AWT程序,該類一般用于自動(dòng)用戶界面的測(cè)試或演示程序[2]。將其用于對(duì)某一事件的反映,解決自動(dòng)擊鍵問(wèn)題應(yīng)該還是本論文的一個(gè)創(chuàng)新。

Robot類直接繼承自O(shè)bject類,它產(chǎn)生的事件不只是通知某事件隊(duì)列或組件有某輸入事件產(chǎn)生,而是引起真正的動(dòng)作。也就是說(shuō)它產(chǎn)生的鼠標(biāo)事件、鍵盤(pán)事件能真正地模擬用戶的擊鍵和鼠標(biāo)動(dòng)作,從而實(shí)現(xiàn)某種自動(dòng)化。本文就是利用機(jī)器人這一特點(diǎn)代替用戶的重復(fù)擊鍵和鼠標(biāo)動(dòng)作。

3 解決方案的實(shí)現(xiàn)

首先確定,表格單元輸入數(shù)據(jù)時(shí),可以改變單元格位置的鍵是Tab(制表)鍵、Enter(回車)鍵、上箭頭、下箭頭、左箭頭、右箭頭。于是設(shè)置鍵盤(pán)事件監(jiān)視器,監(jiān)視這幾個(gè)鍵的動(dòng)作。一旦用戶點(diǎn)擊這些鍵,由機(jī)器人完成既定操作。具體實(shí)現(xiàn)如下:

private class KeyHandler implements KeyListener{

public void keyPressed(KeyEvent event){

int keyCode=event.getKeyCode();

if(keyCode==KeyEvent.VK_TAB||keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_ENTER){

robot.keyPress(KeyEvent.VK_SPACE);

robot.keyPress(KeyEvent.VK_BACK_SPACE);}}

public void keyReleased(KeyEvent event){}

public void keyTyped(KeyEvent event){}}

此鍵盤(pán)監(jiān)視器實(shí)現(xiàn)了KeyListener接口。此接口有三個(gè)方法,在此用到keyPress方法,也就是擊鍵方法來(lái)實(shí)現(xiàn)功能。對(duì)于用戶擊鍵的認(rèn)定用到了虛擬鍵代碼,虛擬鍵代碼和PC機(jī)的掃描碼類似(并且相關(guān))。虛擬鍵代碼的取值在KeyEvent類內(nèi)定義[3],如Tab(制表)鍵的虛擬鍵代碼為KeyEvent.VK_TAB,余者查閱相關(guān)的文檔均有敘述,讀者可從其取值推斷出代表哪一個(gè)鍵。這樣我們?cè)谳斎霐?shù)據(jù)時(shí),擊這些鍵時(shí),輸入焦距在移動(dòng)到相應(yīng)的單元格的同時(shí),在用戶輸入數(shù)據(jù)之前自動(dòng)擊鍵,完成我們需要的動(dòng)作。

到此,應(yīng)該說(shuō)大部分的目的已經(jīng)實(shí)現(xiàn),剩下的是精益求精的工作。解決初次輸入數(shù)據(jù)時(shí)自動(dòng)加入操作的問(wèn)題。初次操作啟于用戶對(duì)相應(yīng)表格單元的點(diǎn)擊動(dòng)作。于是再為JTable加入一個(gè)鼠標(biāo)事件監(jiān)視器,捕捉用戶鼠標(biāo)點(diǎn)擊的操作。具體的監(jiān)視器構(gòu)造如下:

private class MouseHandler extends MouseAdapter{

public void mousePressed(MouseEvent e){

robot.keyPress(KeyEvent.VK_SPACE);

robot.keyPress(KeyEvent.VK_BACK_SPACE);}}

此鼠標(biāo)監(jiān)視器繼承自MouseAdapter類。這里只是重載了mousePressed方法,利用這一方法完全能實(shí)現(xiàn)預(yù)定的功能。

4 討論

在實(shí)際的軟件開(kāi)發(fā)工程中會(huì)遇到各種各樣的問(wèn)題,這需要開(kāi)發(fā)人員認(rèn)真分析具體的條件不拘一格地拿出解決方案?,F(xiàn)階段使用的大部分計(jì)算機(jī)軟件來(lái)自西方國(guó)家特別是美國(guó),默認(rèn)的字符就是英文字符。中文字符的問(wèn)題是一個(gè)遠(yuǎn)沒(méi)有解決好的問(wèn)題,值得關(guān)注。

本文就特定狀態(tài)下遇到中文輸入問(wèn)題時(shí)的應(yīng)對(duì)進(jìn)行了一些介紹。關(guān)鍵之處:1) 對(duì)中英文兩種輸入法下表現(xiàn)完全相同的鍵位的探討;2)對(duì)Robot類的應(yīng)用領(lǐng)域的拓展。某個(gè)問(wèn)題解決的方法可能有多個(gè),作者提出的只是一種,希望能得到熱心讀者的指正。

參考文獻(xiàn):

[1] CayS. Horstmann Gary Cornell. Java 2核心技術(shù)卷I:原理(原書(shū)第5卷)[M]. 北京:機(jī)械工業(yè)出版社,2002.

[2] Sun. MicroSystems. Java SE6 Documentation. http://java.sun.com/javase/downloads/.

[3] Y. Daniel Liang. Java語(yǔ)言程序設(shè)計(jì)基礎(chǔ)篇[M]. 北京:機(jī)械工業(yè)出版社,2006.

猜你喜歡
機(jī)器人
機(jī)器人,讓未來(lái)走近你
金橋(2019年10期)2019-08-13 07:15:16
機(jī)器人來(lái)幫你
認(rèn)識(shí)機(jī)器人
機(jī)器人來(lái)啦
為什么造機(jī)器人?
認(rèn)識(shí)機(jī)器人
且末县| 耒阳市| 铜陵市| 阿鲁科尔沁旗| 治多县| 龙门县| 天长市| 南岸区| 禹城市| 绍兴县| 乌拉特后旗| 庄河市| 麟游县| 青岛市| 息烽县| 泾阳县| 鞍山市| 慈溪市| 巨鹿县| 沭阳县| 普兰店市| 宜州市| 高雄市| 柳林县| 衡水市| 二手房| 简阳市| 菏泽市| 铁力市| 资讯 | 当雄县| 丰原市| 济源市| 新野县| 佛冈县| 报价| 四平市| 五原县| 陈巴尔虎旗| 瓦房店市| 股票|