如何防止JScrollPane中移动插入符号箭头键操作时滚动窗格包装文本窗格(How to prev

2019-06-27 05:05发布

我有以下要求:

我需要一个滚动的JTextPane。 用户可以键入到本文窗格或文本可被插入到它未由用户键入。 认为像一个IM窗口。 虽然窗口必须滚动允许用户查看文本以前键入,光标不应该从它的位置在文本的末尾移动。 由用户输入的任何文本将总是出现在最后。

在JTextPane中,当使用滚动条的用户滚动,光标不移动。 视口进行调整。 然而,当用户按压向上和向下箭头键时,插入符号的JTextPane与它移动(窗口是否滚动或没有)。

我想要的是一个向上的箭头键将功能一样了鼠标移动滚动条。 箭头键应该有无关插入符号。

我曾尝试以下方法,但没有成功:1)加一个“不操作”行动的键盘映射我的文本窗格类(使用JTextPane.addKeymap()和Keymap.addActionForKeyStroke())。 这将停止从移动插入,但防止该动作被传递到滚动窗格滚动视图。 2)从键盘布局方向键为我的文本窗格类。 这会影响我的应用程序,它是不是我想要的所有JTextPanes。

我想要的是一个动作添加到我的TextPane键盘布局简单地呼吁向上和向下箭头滚动窗格动作。

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

发生对我一种可能性是执行一个的KeyListener(其接收的关键笔划键映射之前)以捕获这些密钥然后执行由手滚动。 但是,这似乎需要我来计算字体大小等是否有更简单的方法?

理想的事情是,如果有一些方法来“锚”插入符号到任何文本的结束了。

Answer 1:

你将不得不修改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


Answer 2:

如果你让用户所插入符如让他选择和复制一些文字?

我想补充某个DocumentFilter(或重写insertString文档的()方法)和在所有情况下在doc.getLength()位置执行插入和插入符号复位到插入后的doc.getLength()的位置。



文章来源: How to prevent JScrollPane arrow key handling from moving caret when Scroll Pane wraps Text Pane