在大多数文本编辑器和平台中,有两种使用鼠标选择文本的方法:
常规方法是单击+拖动,随鼠标光标移动所选内容的末尾
双击+拖动,与#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 的工作原理),您可以获得选择的开始和结束位置,并实际选择的开始和结束位置他们的话:
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
(请参阅 Which event a selection of text trigger in 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);
}
}
关于Java Swing 双击+拖动以选择整个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029617/