当前位置: 首页 > 面试题库 >

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

段劲
2023-03-14
问题内容

我有以下要求:

我需要一个可滚动的JTextPane。用户可以在此文本窗格中键入,也可以将用户未键入的文本插入其中。想像即时消息窗口。尽管窗口必须是可滚动的,以允许用户查看以前键入的文本,但插入符号绝不能从其在文本末尾的位置移开。用户输入的任何文本将始终显示在末尾。

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

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

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

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

做到这一点的最佳方法是什么?

我想到的一种可能是实现KeyListener(该监听器在键映射之前接收到击键)以捕获这些键,然后手动实现滚动。但这似乎需要我计算字体大小等。有没有更简单的方法?

理想的事情是,如果有某种方法可以将插入符“锚定”到文本的结尾。


问题答案:

您将需要修改 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


 类似资料:
  • 问题内容: 我在JScrollPane中有一个JTextArea组件,并且文本区域不可编辑。我想使用向上和向下箭头键滚动文本区域(即,按箭头键将文本区域滚动一行)。任何想法如何实现这一目标? 问题答案: 是的,键绑定是必经之路,但是您不一定总是需要创建自己的动作。Swing组件带有您经常可以重用的默认操作。 有关这些操作的完整列表,请参见键绑定。 现在您知道了动作名称,您可以将其绑定到keyStr

  • 基于此注释https://stackoverflow.com/a/29530135/1387524,我添加了一个ScrollPane,以便在画布移到可见区域之外时使用滚动。

  • 我正在尝试获取一些关于组件的信息,这些组件按标准包含在中。特别是我对阅读水平的感兴趣。我怎么参考?

  • 我有一个内部滚动条的div组件,我想防止向上/向下箭头键在元素聚焦时滚动(鼠标单击元素),因为它们用于其他事件(例如缩放)。 我找到的唯一解决方案是将事件侦听器附加到文档,但是,它禁用所有默认的箭头键事件,例如在输入字段中移动光标。 以下是一个示例(在React中):https://codesandbox.io/s/rsc-live-example-fze6z 如何复制: 用鼠标点击内部div(有

  • 我希望能够向下滚动动态生成的电影列表。我尝试添加滚动窗格。 我在页面的开头有一个导航栏,中间有一个包含所有电影的jpanel。 您可以使用以下代码重新创建此示例: 我想做的是用我的鼠标滚轮向下滚动这个电影列表,而不看任何滚动条。它现在看起来应该和现在一模一样,但我希望能够向下滚动,看到所有的电影。 我不知道为什么它不起作用,这就是为什么我在这里问,希望有人能向我解释我做错了什么。

  • 问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常