在大多数文本编辑器和平台中,有两种使用鼠标选择文本的方法:
常规的 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;
}
Run Code Online (Sandbox Code Playgroud)
然后在你的 UI 中(不确定 JTextArea 是如何工作的)你可以得到你的选择的位置start和end位置,并实际选择它们的单词的开始和结束位置:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是在哪里调用上面的代码片段呢?您可以监听(请参阅CarretEventJava JTextArea 中选择文本的哪个事件触发?):MouseEvent
textArea.addCarretListener((evt) -> updateSelection(textArea));
Run Code Online (Sandbox Code Playgroud)
但又出现了一个问题:如何知道.net的点击次数MouseEvent。你可以做一个属性来存储它,然后放入鼠标事件监听器中,就可以设置它了。下面的代码尝试将所有内容组合在一起:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |