Swing Text组件都扩展了JTextComponent
,当用户选择一些文本时,JTextComponent
类将处理所选文本的工作委托给Caret
接口的一个示例(称为DefaultCaret
)。以及对改变选择范围的鼠标和键盘事件的响应。
Swing DefaultCaret
具有标准插入符号的大部分行为,但我的一些高端用户指出了它的不足之处。
(Note:这些示例在Microsoft Edge中会遇到问题,因为当您选择文本时,它会显示......“”菜单。在这些示例中,如果您使用Edge,则需要键入escape键以摆脱该菜单,然后再继续下一步。)
1.如果我双击一个单词,它应该选择整个单词。Java Swing的脱字符可以做到这一点。但是,双击一个单词后,如果我试图通过按住Shift键并单击第二个单词来扩展选择范围,标准脱字符会扩展选择范围以包括整个第二个单词。为了说明这一点,在下面的示例文本中,如果我双击时钟中的o,它将选择单词时钟。但是如果我接着按住shift键并在wound中的o之后单击,它应该将选择一直扩展到d。它在这个页面上这样做,但在Java Swing中不是这样。在Swing中,它仍然扩展选择,但只扩展到鼠标单击的位置。
这钟上的发条太紧了。
1.如果我尝试通过单击鼠标左键来选择一个文本块,然后拖动,当我拖动文本时,它应该会一次扩展一个完整的单词(“单击鼠标左键,然后拖动",我的意思是在同一个位置快速完成以下事件:mouseDown,mouseUp,mouseDown,mouseMove.这就像是没有最后一个mouseup事件的双击.)你可以在这个页面上尝试一下,它会起作用,但是在Java Swing中不起作用.在Swing中它仍然会扩展选择,但是只会扩展到鼠标的位置.
1.如果我三次点击某个文本,它将选择整个段落。(这在Microsoft Edge中不起作用,但在大多数浏览器和编辑器中起作用)这在Swing中不起作用。
1.如果在三次单击选择一个段落后,我在按住Shift键的同时单击另一个段落,它应该会扩展选择范围以包括整个新段落。
1.就像第2项中的完全单击并拖动示例一样,如果您进行完全双击并拖动,它应该首先选择整个段落,然后一次扩展选择一个段落。(同样,这在Edge中不起作用。)这种行为没有其他行为那么标准,但仍然非常常见。
我的一些高级用户希望能够在我维护的Java Swing应用程序中使用这些功能,我想把这些功能提供给他们。我的应用程序的全部意义在于加快他们的数据处理速度,这些更改将有助于实现这一点。我该如何做到呢?
1条答案
按热度按时间6l7fqoea1#
我写了一个类来解决这些问题。它解决了问题1和问题2。就三次点击而言,它不会改变选择行而不是选择段落的行为,但它解决了所选行上的问题4,与三次点击的行为一致。它没有解决问题5。
这个类还有两个工厂方法,可以将插入符号无故障地安装到文本组件中。