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

标签 java swing

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

  1. 常规方法是单击+拖动,随鼠标光标移动所选内容的末尾

  2. 双击+拖动,与#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/

相关文章:

java - 如何从JTable中获取存储的对象

java - 如何仅获取 java 类的 protected 和公共(public)构造函数?

java - 获取 JTable 的 JScrollPane

java - JTable:如何获取表的更新列和行?

java - 如何禁用框架并启用关闭/最小/最大按钮

java - Spring Data 存储库实际上是如何实现的?

java - 使用 MySQL 连接器 Jar 在 Windows CMD 中编译项目

java - 现在如何在 Java Fx 上的属性更改监听器上使用通用包装值?

java - 计时器滴答一秒后,如何更改 java 中的标签文本?

Java 权限 Swing