Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 控制JTextPane中的选择/浏览_Java_Swing_Selection_Jtextpane - Fatal编程技术网

Java 控制JTextPane中的选择/浏览

Java 控制JTextPane中的选择/浏览,java,swing,selection,jtextpane,Java,Swing,Selection,Jtextpane,我有一个JTestPane包含一些文本(显然)。使用键盘浏览文本时,通常使用control+右箭头跳过整个单词。JTestPane中的默认行为是将插入符号放在下一个单词的第一个字符之前 例如,让我们来考虑这个句子“这是一个句子”。从位置0开始,如果我跳过“This”并转到下一个单词(使用CTRL+RIGHT),插入符号将位于位置5,即“is”之前 这对于浏览很好,但我不喜欢这种文本选择行为。在我正在开发的应用程序中,如果在使用SHFT+CTRL+RIGHT时,我只选择“This”(没有额外的空间

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

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

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

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


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

Swing在调用某个击键时使用键绑定来调用操作。有关这些绑定的列表,请参见。如您所见,在本例中调用了
选择下一个单词
操作,因此您需要提供一个自定义操作

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


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

Swing在调用某个击键时使用键绑定来调用操作。有关这些绑定的列表,请参见。如您所见,在本例中调用了
选择下一个单词
操作,因此您需要提供一个自定义操作

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


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

因此,我听从了camickr的建议,更改了与
选择下一个单词相关的
操作。对于那些感兴趣的人,以下是我所做的

首先,我检索了内部类
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
,使其位于尾随空格之前。我还希望它在任何的之前(比如在genitive的标记中,例如Vincent*的*bike),因此我的源代码的第二部分(这个附加功能在我的原始问题中没有指定)

然而,仅此一项修改就出现了一个新问题:现在无法选择几个连续的单词。当多次按SHFT+CTRL+RIGHT时,所选内容会卡在第一个单词上

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

//检查尾随“”

如果是这样,我听从卡米克的建议,改变了与选择下一个单词相关的
操作

首先,我检索了内部类
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
,使其位于尾随空格之前。我还希望它位于任何的之前(比如在genitive的标记中,例如Vincent*的*bike),因此我的源代码的第二部分(这个附加功能在我的原始问题中没有指定)

但是,仅此一项修改就出现了一个新问题:现在无法选择多个连续的单词。当多次按SHFT+CTRL+RIGHT键时,选择就会卡在第一个单词上

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

//检查尾随“”

如果(off),则需要覆盖密钥绑定您需要覆盖密钥绑定