在任何一款桌面應(yīng)用中,都難免會(huì)遇到讓用戶(hù)輸入文字或者特殊字符的情況發(fā)生,所以輸入法的支持與文本框組件的存在就變得必不可少。
由于Java具有桌面應(yīng)用開(kāi)發(fā)能力,它的圖形組件中也當(dāng)然配備有文本框,因而無(wú)論是繼承自TextComponent的Text系組件抑或繼承自JTextComponent的JText系組件都提供了讓用戶(hù)輸入數(shù)據(jù)的功能。
現(xiàn)在的疑問(wèn)是,雖然TextComponent與JTextComponent相類(lèi)似,但兩者的父類(lèi)卻并不同級(jí)。TextComponent直接繼承自Component,但Component已經(jīng)是所有Java圖形組件的公共父類(lèi),JTextComponent的父類(lèi)JComponent卻繼承自Container,而Container的父類(lèi)才是Component。
為什么會(huì)這樣呢?如果JTextComponent直接繼承TextComponent難道不好嗎?沒(méi)錯(cuò),不好,或者說(shuō)不能。除了Swing與AWT運(yùn)行原理造成的差異與組件關(guān)系的統(tǒng)一性需求外,造成這樣情況的理由中還有一點(diǎn)至關(guān)重要,那就是不光JTextComponent不能,即便我們想在java.awt包外重載TextComponent也不能。原因在于,雖然TextComponent類(lèi)并非final,但它的唯一構(gòu)造函數(shù)卻是default的,這意味著即便不同包中的類(lèi)繼承了它,也不能構(gòu)造,根本無(wú)法重載。
更何況,就算可以重載的JTextComponent,也與TextComponent一樣存在著一些很麻煩的默認(rèn)配置問(wèn)題(就更不要說(shuō)重載JTextField抑或TextField了)。最主要的是,用它們制作標(biāo)準(zhǔn)文本框固然游刃有余,但如果我們需要的文本框不那么標(biāo)準(zhǔn),甚至需要某些“奇形怪狀”到只要求輸入文字,但根本就算不上文本框的組件時(shí),那么它們勢(shì)必更加捉襟見(jiàn)肘。
那么,我們要怎樣才能滿(mǎn)足這種近乎于“變態(tài)”的要求呢?
很簡(jiǎn)單,自己“畫(huà)”個(gè)文本框出來(lái)就好了,因?yàn)槭恰爱?huà)”的,所以想它怎樣,便是怎樣,因?yàn)槭菓{空繪制,也沒(méi)有利用現(xiàn)成Swing組件繪制時(shí)的不便。
所以能這樣做,就在于Java獲得輸入法支持的關(guān)鍵點(diǎn)不在TextComponent與JTextComponent,而是java.awt.im包下的相關(guān)組件,更具體地說(shuō),只要你實(shí)現(xiàn)了InputMethodListener與InputMethodRequests兩尊大神,那么所有Component都可以支持輸入法,又何必專(zhuān)情于TextComponent與JTextComponent?
閑話少說(shuō),現(xiàn)在我就直接用Canvas來(lái)“畫(huà)”個(gè)文本框,給大家瞧瞧。
TextCanvas.java
運(yùn)行效果如下圖:
怎么樣?這時(shí)你在TextCanvas中進(jìn)行輸入操作,是不是與JTextField或TextField里相差無(wú)幾呢?——什么?你說(shuō)就算“重復(fù)發(fā)明輪子”也應(yīng)該有個(gè)限度,已經(jīng)有JTextField與TextField了,你再寫(xiě)一個(gè)有什么用?
嗯,您很聰明,單純的繪制文本框確實(shí)沒(méi)有任何意義,但是,如果有一系列直接通過(guò)AWT繪制的組件與其相呼應(yīng)呢?——比如,偶在LGame-Simple中制作的那一系列UI組件……
那么事情,就會(huì)變成如下這個(gè)樣子。
怎么樣呢?如上圖所示,這是一個(gè)純繪制的界面,無(wú)論文本框的字體,大小,顏色乃至透明度,貼圖都可以隨性切換(甚至逆天的將兩個(gè)文本框疊在一起也可以), 而這樣一個(gè)純繪制出的文本框能夠獲得輸入法支持,意味著什么呢?這意味著,一個(gè)相對(duì)于Swing能耗更少,效率更高的類(lèi)Swing體系已經(jīng)搭建成型了!(當(dāng)然,相對(duì)的功能也更少,不過(guò)事無(wú)兩利嘛……)
PS:如上所述,LGame-Simple-0.2.5版Text系組件將獲得輸入法支持,中文或其它語(yǔ)言的輸入已經(jīng)沒(méi)有任何問(wèn)題。(此版預(yù)計(jì)同Android版LGame一道于12月中下旬發(fā)布……不過(guò),那是理想狀態(tài),事實(shí)上偶欠著的事情挺多,盡力看看……)
嗯,其實(shí)PS中的話才是最主要的……
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
