簡體   English   中英

Java Swing 雙擊 + 拖動以選擇整個單詞

[英]Java Swing Double-click + drag to select whole words

在大多數文本編輯器和平台中,有兩種使用鼠標選擇文本的方法:

  1. 常規的 Click+Drag 會隨着鼠標光標移動選擇的結尾

  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中是如何工作的),你可以得到的startend選擇的位置,而實際上選擇自己的言行開始和結束位置:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM