[英]Java Swing Double-click + drag to select whole words
在大多數文本編輯器和平台中,有兩種使用鼠標選擇文本的方法:
常規的 Click+Drag 會隨着鼠標光標移動選擇的結尾
雙擊+拖動,與#1 相同,但它從選擇一個完整的單詞開始,然后將選擇的結尾對齊到整個單詞
然而,在 Swing GUI 中,#2 不像上面那樣工作。 它通過選擇整個單詞在雙擊是正確啟動,但隨后它並沒有選擇過程中捕捉到整個單詞。
有什么方法可以讓 Swing 文本字段的行為與 2 相同,並且選擇會對齊到整個單詞?
您可以創建一種方法來計算您選擇的單詞結束和開始位置的索引。 見下文:
int getWordEndPos(String text, int initPos) {
int i = initPos;
while(Character.isAlphabetic(text.charAt(i))) {
i++;
}
return i;
}
int getWordStartPos(String text, int initPos) {
int i = initPos;
while(Character.isAlphabetic(text.charAt(i))) {
i--;
}
return i+1;
}
然后在你的UI(不知道JTextArea中是如何工作的),你可以得到的start
和end
選擇的位置,而實際上選擇自己的言行開始和結束位置:
void updateSelection(JTextArea ta) {
String text = ta.getText();
int start = ta.getSelectionStart();
int end = ta.getSelectionEnd();
start = getWordStartPos(text, start);
end = getWordEndPos(text, end);
ta.select(start, end);
}
但是在哪里調用上面的代碼片段? 您可以收聽CarretEvent
而不是MouseEvent
(請參閱Java JTextArea 中的哪個事件選擇文本觸發? ):
textArea.addCarretListener((evt) -> updateSelection(textArea));
但是出現了另一個問題:如何知道MouseEvent
的點擊次數。 您可以創建一個屬性來存儲它,然后進入鼠標事件偵聽器,它可以被設置。 下面的代碼試圖把所有東西放在一起:
class UI implements MouseListener, CarretListener {
JTextArea textArea;
int clickCount = 0;
UI() {
textArea.addCarretListener(this);
textArea.addMouseListener(this);
// ...
}
@Override
void mouseClicked(MouseEvent evt) {
this.clickCount = evt.getClickCount();
// other stuff
}
// other MouseListener methods
@Override
void caretUpdate(CaretEvent evt) {
if (clickCount == 1) updateSelection(textArea);
// other caret listener stuff
}
void updateSelection(JTextArea ta) {
String text = ta.getText();
int start = ta.getSelectionStart();
int end = ta.getSelectionEnd();
start = getWordStartPos(text, start);
end = getWordEndPos(text, end);
ta.select(start, end);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.