如何在滚动窗格包装文本窗格时阻止JScrollPane箭头键处理移动插入符号

时间:2012-08-20 16:13:38

标签: java swing jscrollpane jtextpane caret

我有以下要求:

我需要一个可滚动的JTextPane。用户可以键入该文本窗格,或者可以将文本插入到未由用户键入的文本窗格中。想想像IM窗口。尽管窗口必须是可滚动的,以允许用户查看先前键入的文本,但是插入符应该永远不会从文本末尾的位置移动。用户输入的任何文本将始终显示在最后。

在JTextPane中,当用户使用滚动条滚动时,插入符号不会移动。视口已调整。但是,当用户按下向上和向下箭头键时,JTextPane插入符随之移动(无论窗口是否滚动)。

我想要的是向上箭头键与使用鼠标向上移动滚动条的功能相同。箭头键应该与插入符号无关。

我尝试了以下方法,但没有成功: 1)在我的文本窗格类的Keymap中添加“No-op”动作(使用JTextPane.addKeymap()和Keymap.addActionForKeyStroke())。这会阻止插入符移动,但会阻止操作传递到滚动窗格以滚动视图。 2)从我的文本窗格类的键映射中删除箭头键。这会影响我的应用程序中的所有JTextPanes,这不是我想要的。

我想要的是向我的TextPane键盘图添加一个动作,该动作只是为向上和向下箭头调用ScrollPane动作。

实现这一目标的最佳方法是什么?

我遇到的一种可能性是实现KeyListener(它在键映射之前接收键击)来捕获这些键,然后手动实现滚动。 但这似乎要求我计算字体大小等。有更简单的方法吗?

理想的是,如果有一些方法可以将插入符号“锚定”到文本的末尾。

2 个答案:

答案 0 :(得分:3)

您将不得不修改KeyBindings

尝试以

开头
InputMap im = textArea.getInputMap(WHEN_FOCUSED);
ActionMap am = textArea.getActionMap();

am.get("caret-down").setEnabled(false);
am.get("caret-up").setEnabled(false);

现在你已经开始工作了,你需要担心所有这些

selection-up = shift pressed UP
caret-next-word = ctrl pressed RIGHT
selection-previous-word = shift ctrl pressed LEFT
selection-up = shift pressed KP_UP
caret-down = pressed DOWN
caret-previous-word = ctrl pressed LEFT
caret-end-line = pressed END
selection-page-up = shift pressed PAGE_UP
caret-up = pressed KP_UP
delete-next = pressed DELETE
caret-begin = ctrl pressed HOME
selection-backward = shift pressed LEFT
caret-end = ctrl pressed END
delete-previous = pressed BACK_SPACE
selection-next-word = shift ctrl pressed RIGHT
caret-backward = pressed LEFT
caret-backward = pressed KP_LEFT
selection-forward = shift pressed KP_RIGHT
delete-previous = ctrl pressed H
unselect = ctrl pressed BACK_SLASH
insert-break = pressed ENTER
selection-begin-line = shift pressed HOME
caret-forward = pressed RIGHT
selection-page-left = shift ctrl pressed PAGE_UP
selection-down = shift pressed DOWN
page-down = pressed PAGE_DOWN
delete-previous-word = ctrl pressed BACK_SPACE
delete-next-word = ctrl pressed DELETE
selection-backward = shift pressed KP_LEFT
selection-page-right = shift ctrl pressed PAGE_DOWN
caret-next-word = ctrl pressed KP_RIGHT
selection-end-line = shift pressed END
caret-previous-word = ctrl pressed KP_LEFT
caret-begin-line = pressed HOME
caret-down = pressed KP_DOWN
selection-forward = shift pressed RIGHT
selection-end = shift ctrl pressed END
selection-previous-word = shift ctrl pressed KP_LEFT
selection-down = shift pressed KP_DOWN
insert-tab = pressed TAB
caret-up = pressed UP
selection-begin = shift ctrl pressed HOME
selection-page-down = shift pressed PAGE_DOWN
delete-previous = shift pressed BACK_SPACE
caret-forward = pressed KP_RIGHT
selection-next-word = shift ctrl pressed KP_RIGHT
page-up = pressed PAGE_UP

答案 1 :(得分:1)

如果您让用户放置插入符号,该怎么办?让他选择并复制一些文字?

我会添加一个DocumentFilter(或覆盖Document的insertString()方法),并且在所有情况下都会在doc.getLength()位置执行insert,并在插入后将插入符重置为doc.getLength()位置。 / p>