因此,我按照 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 的帮助。