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