java - Java Swing 双击+拖动选择整个单词
问题描述
在大多数文本编辑器和平台中,有两种使用鼠标选择文本的方法:
常规的 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);
}
}
推荐阅读
- django - “用户”对象没有属性“图像”
- javascript - 为什么节点快递中的mongodb无法将结果设置为外部变量
- android - 如何不使用 androidX 销毁片段
- angular - Angular 材质 mat-slide-toggle 更改切换图标
- asp.net - 使用 EO.pdf 将 Html 转换为 PDF 时如何应用密码保护?
- javascript - 未捕获的引用错误:未定义变量
- jquery - 我正在使用 laravel 5.4 并使用 ajax 提交
- javascript - 动态创建的 html 来获取图像 - 我想在提交之前显示检索到的图像
- datetime - 如何将 URL 中的 DateTime 值从 Postman 传递到 ASP.Net Core MVC 控制器
- python - 如何在 Python 中导入 OpenSSL 以获取证书的序列号