JTextComponent.select()或者selectAll()方法沒有選中效果

 

public void select(int selectionStart, int selectionEnd)

選定指定的開始和結束位置之間的文本。

此方法設置選定文本的開始位置和結束位置,並強行限制開始位置必須大於等於零。結束位置必須大於等於開始位置,並大於等於文本組件的文本長度。

如果調用者提供不一致或超出限度的值,則該方法靜默地實施這些限制,並且不會失敗。要特別指出的是,如果開始位置或結束位置大於文本長度,則將它重置爲等於文本長度。如果開始位置小於零,則將它重置爲零,如果結束位置小於開始位置,則將它重置爲開始位置。

此調用是爲向後兼容性提供的。將其作爲調用 setCaretPosition 的途徑,接着再調用 moveCaretPosition。管理選定的首選方法是直接調用這些方法。

參數:

selectionStart - 文本的起始位置

selectionEnd - 文本的結束位置

另請參見:

setCaretPosition(int), moveCaretPosition(int)

 

以上是swing中文本控件JTextComponent的select方法的api說明,JTextComponent是一個抽象類,在實際使用中,我們一般經常接觸到的是其子類JTextField、JTextArea。

select方法很好理解,即將文本框中的指定位置的文字內容設置爲選中狀態,就顯示狀態來說,被選中的文字內容,其前景色和背景色將與未選中的文字內容區別顯示,如下圖所示。

 

我編寫了一個文字搜索對話框,可以對控件中的文字進行搜索。

 

第一個例子

我在JTextArea中執行搜索操作時,一切功能正常。

 

第二個例子

當我在對一個JTextField執行搜索時,被搜索到的文字並沒有產生選中效果,而當我關閉搜索對話框後,搜索到的文字顯示出了選中效果。由此可以推測出,搜索功能實際上已經成功執行了,只是文字的選中效果沒有表現出來。而選中效果之所以沒有表現出來,顯然與焦點有關。當搜索對話框沒有關閉的時候,焦點被搜索對話框持有,所以JTextField中被選中的文字不能顯示選中效果,當搜索對話框被關閉後,焦點回到了JTextField中,被選中的文字正常顯示顯示效果。

 

講道理,在第一個例子中,JTextArea也是在沒有持有焦點的情況之下,但爲什麼被選中文字卻能夠正常顯示選中效果呢?暈~

 

如何解決第二個例子中遇到的問題?

方法一

既然是焦點的問題,那就用焦點來解決。在搜索完成之後,強制將焦點還給JTextField。

修改前:

textField.select(start, end);

修改後:

textField.requestFocus();

textField.select(start, end);

也可以修改爲:

textField.requestFocusInWindow ();

textField.select(start, end);

 

但問題來了。

問題一:焦點能否成功獲取。

首先,requestFocus和requestFocusInWindow這兩個方法都是請求焦點,但能否請求成功是不受到保證的,事實上,某些情況下請求焦點是不會成功的。其次,這兩個方法不但名稱不一樣,它們的實際執行效果也未必一致,某些情況下,其中一個方法能夠成功獲取焦點,而另一個卻不行。總而言之,這倆貨根本不受開發者控制,能否成功獲得焦點完全是聽天由命。

 

問題二:連續搜索問題。

在搜索這件事上,連續搜索是必須考慮的,用戶可以按着回車鍵一路搜索下去,只到搜索結束或者用戶看到自己期望的內容。

如果要實現連續搜索,那搜索框就應該一直持有焦點,而不應該將焦點還回被搜索的控件,因此,該解決方案與用戶需求是存在衝突的。

 

方法二

使用高亮顯示類Highlighter,這纔是好東西,開發者可以一次性在一個文本控件中多個位置設置選中狀態,甚至可以在不同的地方使用不同的選中樣式。而select方法則只能在文本框中存在一個選中狀態。

     public void selectText(int start, int end)

     {

         Highlighter highlighter = this.textField.getHighlighter();

         highlighter.removeAllHighlights();

         highlighter.addHighlight(start, end, HIGHLIGHT_PAINTER);

     }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章