999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

JTable內中文輸入的一種解決方案

2009-09-30 05:54:42王占中,張涵
電腦知識與技術 2009年34期

王占中,張涵

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

關鍵詞:JAVA;JTable;機器人;事件監視器

中圖分類號:TP312文獻標示碼:A文章編號: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開發一個應用軟件時,使用JTable作為輸入界面接受用戶輸入的數據。用戶在使用過程中發現:用英文輸入法時非常方便,只要用制表鍵或方向箭頭鍵移到要輸入的表格位置,直接輸入即可;而用中文輸入法時,用上面的控制鍵移到要輸入的位置時卻無法直接輸入數據,需要用戶用鼠標點擊相應位置一下才可以輸入數據,給用戶帶來諸多不便。于是尋求解決的方法,愿將方法尋找的過程以及最后的結果奉獻出來,供方家們指正。如有尺寸可取,不勝欣慰。

1 方案的尋求過程

初遇此問題,計劃從JTable本身尋求解決方案。力圖找到JTable對英文方式、中文方式的區別。經過研究JTable的文檔資料,未能發現其對中英文方式的不同論述,這方面的努力未能成功。

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

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

2 涉及到的關鍵技術

實施本方案主要使用兩種技術:事件監視器與機器人。

2.1 事件監視器技術

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

本文用到的監視器兩種類型:鍵盤監視器和鼠標監視器。前者解決除首次輸入的所有位置的輸入問題,后者自然是解決首次輸入問題。

2.2 AWT機器人技術

Robot類是自JAVA 2的1.3版本添加的,可以利用該類將擊鍵和鼠標點擊發送到任何AWT程序,該類一般用于自動用戶界面的測試或演示程序[2]。將其用于對某一事件的反映,解決自動擊鍵問題應該還是本論文的一個創新。

Robot類直接繼承自Object類,它產生的事件不只是通知某事件隊列或組件有某輸入事件產生,而是引起真正的動作。也就是說它產生的鼠標事件、鍵盤事件能真正地模擬用戶的擊鍵和鼠標動作,從而實現某種自動化。本文就是利用機器人這一特點代替用戶的重復擊鍵和鼠標動作。

3 解決方案的實現

首先確定,表格單元輸入數據時,可以改變單元格位置的鍵是Tab(制表)鍵、Enter(回車)鍵、上箭頭、下箭頭、左箭頭、右箭頭。于是設置鍵盤事件監視器,監視這幾個鍵的動作。一旦用戶點擊這些鍵,由機器人完成既定操作。具體實現如下:

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){}}

此鍵盤監視器實現了KeyListener接口。此接口有三個方法,在此用到keyPress方法,也就是擊鍵方法來實現功能。對于用戶擊鍵的認定用到了虛擬鍵代碼,虛擬鍵代碼和PC機的掃描碼類似(并且相關)。虛擬鍵代碼的取值在KeyEvent類內定義[3],如Tab(制表)鍵的虛擬鍵代碼為KeyEvent.VK_TAB,余者查閱相關的文檔均有敘述,讀者可從其取值推斷出代表哪一個鍵。這樣我們在輸入數據時,擊這些鍵時,輸入焦距在移動到相應的單元格的同時,在用戶輸入數據之前自動擊鍵,完成我們需要的動作。

到此,應該說大部分的目的已經實現,剩下的是精益求精的工作。解決初次輸入數據時自動加入操作的問題。初次操作啟于用戶對相應表格單元的點擊動作。于是再為JTable加入一個鼠標事件監視器,捕捉用戶鼠標點擊的操作。具體的監視器構造如下:

private class MouseHandler extends MouseAdapter{

public void mousePressed(MouseEvent e){

robot.keyPress(KeyEvent.VK_SPACE);

robot.keyPress(KeyEvent.VK_BACK_SPACE);}}

此鼠標監視器繼承自MouseAdapter類。這里只是重載了mousePressed方法,利用這一方法完全能實現預定的功能。

4 討論

在實際的軟件開發工程中會遇到各種各樣的問題,這需要開發人員認真分析具體的條件不拘一格地拿出解決方案。現階段使用的大部分計算機軟件來自西方國家特別是美國,默認的字符就是英文字符。中文字符的問題是一個遠沒有解決好的問題,值得關注。

本文就特定狀態下遇到中文輸入問題時的應對進行了一些介紹。關鍵之處:1) 對中英文兩種輸入法下表現完全相同的鍵位的探討;2)對Robot類的應用領域的拓展。某個問題解決的方法可能有多個,作者提出的只是一種,希望能得到熱心讀者的指正。

參考文獻:

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

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

[3] Y. Daniel Liang. Java語言程序設計基礎篇[M]. 北京:機械工業出版社,2006.

主站蜘蛛池模板: 四虎成人在线视频| 国产成人免费视频精品一区二区| 亚洲成在线观看 | 国产9191精品免费观看| 熟女日韩精品2区| 无码精油按摩潮喷在线播放| 国产精品私拍在线爆乳| 综合亚洲网| 波多野衣结在线精品二区| av性天堂网| 欧美国产日韩另类| 久久a级片| 精品国产网站| 亚洲人免费视频| 在线播放精品一区二区啪视频| 国产国语一级毛片| 日韩国产欧美精品在线| 国产一级视频久久| 国产成人免费手机在线观看视频 | 久久久久亚洲精品无码网站| 欧美国产在线一区| 欧美特黄一级大黄录像| 久久久久国产精品熟女影院| 美女毛片在线| 成人在线视频一区| 2020国产免费久久精品99| 凹凸精品免费精品视频| 亚洲成人高清无码| 欧美日本在线观看| 爱做久久久久久| 国产精品亚洲αv天堂无码| 91小视频在线观看| 又猛又黄又爽无遮挡的视频网站| 青青草国产免费国产| 欧美午夜在线播放| 91麻豆精品视频| 激情综合网址| 91青青草视频在线观看的| 成人另类稀缺在线观看| 一区二区偷拍美女撒尿视频| 国内精品九九久久久精品| 亚洲第一黄色网| 亚洲欧美天堂网| 婷婷99视频精品全部在线观看| 国产欧美一区二区三区视频在线观看| 精品国产成人三级在线观看| 99精品在线看| 国产激情无码一区二区APP| 欧美翘臀一区二区三区| AV无码一区二区三区四区| 国内老司机精品视频在线播出| 久久人人97超碰人人澡爱香蕉| 青青热久免费精品视频6| 四虎国产成人免费观看| 成人午夜久久| 国产jizz| 99草精品视频| 国产成人高清精品免费5388| 国产精品所毛片视频| 再看日本中文字幕在线观看| www.99精品视频在线播放| 美女啪啪无遮挡| 精品乱码久久久久久久| 欧美精品xx| 中文字幕波多野不卡一区| 欧美a√在线| 亚洲香蕉伊综合在人在线| 91福利在线观看视频| 国产日韩欧美一区二区三区在线 | 久久精品aⅴ无码中文字幕 | 国产亚洲精品自在线| 国产日韩欧美精品区性色| 亚洲国产日韩欧美在线| 9966国产精品视频| 98超碰在线观看| 韩国v欧美v亚洲v日本v| 国产91av在线| 4虎影视国产在线观看精品| 少妇精品网站| 福利在线一区| 亚洲AV无码久久精品色欲| 一级爱做片免费观看久久|