Java Swing双击并拖动以选择整个单词 - java

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

  • 常规的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;
    }
    

    然后,在用户界面(不确定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(请参阅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 SearchBox模型 - java

    我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

    Java swing-事件触发后,我可以在选项卡上更改名称吗? - java

    一,代码:tab_textArea_file.addTab(docLabel, null, scrollPane_textArea, null); 因此,情况是我有一个可供用户选择的文件列表。用户单击文件时,将读取文件的内容并将其加载到textArea中。 “ docLabel”(在上面的代码中)是应该更改为所选文件名的字符串,但并非如此。是否可以通过上面的…

    Swing-典型桌面应用程序中的并发 - java

    这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

    Java-将int更改为ascii - java

    java有没有办法将int转换为ascii符号? 参考方案 您是否要将int转换为char?:int yourInt = 33; char ch = (char) yourInt; System.out.println(yourInt); System.out.println(ch); // Output: // 33 // ! 还是要将int转换为Stri…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)