Java Swing 双击 + 拖动以选择整个单词

foo*_*olo 5 java swing

在大多数文本编辑器和平台中,有两种使用鼠标选择文本的方法:

  1. 常规的 Click+Drag 会随着鼠标光标移动选择的结尾

  2. 双击+拖动,与#1 相同,但它从选择一个完整的单词开始,然后将选择的结尾对齐到整个单词

然而,在 Swing GUI 中,#2 不像上面那样工作。它通过选择整个单词在双击是正确启动,但随后它并没有选择过程中捕捉到整个单词。

有什么方法可以让 Swing 文本字段的行为与 2 相同,并且选择会对齐到整个单词?

LBa*_*ald 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 是如何工作的)你可以得到你的选择的位置startend位置,并实际选择它们的单词的开始和结束位置:

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)