1

我有一个JTestPane包含一些文本(显然)。使用键盘浏览文本时,通常使用 control + 向右箭头来跳过整个单词。默认行为JTestPane包括将插入符号放在下一个单词的第一个字符之前。

例如,让我们考虑句子“This is a sentence”。从位置 0 开始,如果我跳过“This”并转到下一个单词(使用 CTRL+RIGHT),插入符号将位于位置 5,即在“is”之前。

这对于浏览来说很好,但我不喜欢这种文本选择行为。在我正在处理的应用程序中,如果在使用 SHFT+CTRL+RIGHT 时,我只选择“This”(没有额外的空间)而不是“This”,那会更好,因为它是默认的。换句话说,我想选择字符 0-3 而不是 0-4。

我没有找到太多关于如何调整 Swing 以获得这种结果的信息。到目前为止,我已经尝试注册 aCaretListenerJTestPane手动缩短选择,以便在必要时删除尾随空格。但是感觉不太对劲,而且效果也不好,因为它阻止了选择多个单词。

所以,如果有人能指出我正确的方向,我会非常高兴。

4

2 回答 2

4

当调用某个 KeyStroke 时,Swing 使用 Key Binding 来调用 Action。有关这些绑定的列表,请参阅绑定。如您所见,selection-next-word在这种情况下会调用 Action,因此您需要提供自定义 Action。

您可以查看DefaultEditorKit- 的源代码,了解它是如何实现的,只需减少选择 1 即可。

或者,也许您可​​以使用Wrapping Actions概念来包装原始 Action,然后调用 JTextPane 的 setSelection() 方法将选择重置为比您需要的少 1。不确定更简单的方法是什么。

于 2013-11-12T20:58:09.593 回答
0

因此,我按照 camickr 的建议将Action关联更改为selection-next-word. 对于那些感兴趣的人,这就是我所做的。

首先,我检索了内部类的源代码DefaultEditorKit.NextWordAction,它在跳过(浏览时)和选择单词时都被调用。然后我复制它来定义我自己的版本,并actionPerformed通过以下方式修改它的方法。

该方法包含指令offs = Utilities.getNextWord(target, offs);,该指令对应于下一个单词开头的插入符号位置的处理。变量target是考虑的JTextComponent并且offs是当前插入符号位置。在方法调用之后,offs包含下一个单词的开头位置。

所以,我在这一行之后添加了以下代码:

        // remove trailing space from selection 
        if(offs>0)          
        {   String c = target.getText(offs-1, 1);
            if(c.equals(" "))
                offs = offs - 1;
        }
        // remove trailing "'s" from selection 
        if(offs>1)
        {   String c = target.getText(offs-2, 2);
            if(c.equals("'s"))
                offs = offs - 2;
        }

如您所见,它进行了更正offs,使其位于尾随空格之前。我还希望它在任何 's 之前(如属格标记,例如 Vincent** 自行车),因此我的源代码的第二部分(这个附加功能在我的原始问题中没有指定)。

但是,通过这种单独的修改,出现了一个新问题:现在无法选择几个连续的单词。多次按 SHFT+CTRL+RIGHT 时,选择会卡在第一个单词上。

因此,为避免这种情况,我在前面提到的行(调用)之前添加了以下代码:getNextWord

        // check for trailing "'"
        if(offs<end-2)
        {   String c = target.getText(offs, 2);
            if(c.equals("'s"))
                offs = offs + 2;
        }
        // check for trailing space
        if(offs<end-1)
        {   String c = target.getText(offs, 1);
            if(c.equals(" "))
                offs = offs + 1;
        }

现在,它工作正常,这正是我想要的。非常感谢 camickr 的帮助。

于 2013-11-13T08:58:02.727 回答