Java 禁用JTextPane中的编辑,同时允许可见光标移动
我有一个Java 禁用JTextPane中的编辑,同时允许可见光标移动,java,swing,jtextpane,Java,Swing,Jtextpane,我有一个JTextPane,通过读取文件填充,然后对数据进行解析和格式化。不允许用户编辑JTextPane,但我希望他们能够使用可见光标在其中导航 如果我使用setEditable(false),光标是不可见的,尽管可以通过按住Shift并使用箭头键选择文本块来间接观察不可见光标的位置 为了在不允许编辑时启用可见光标,我创建了一个虚拟的DocumentFilter,而不是setediate(false),它对其insertString()、remove()和replace()方法不做任何操作。但
JTextPane
,通过读取文件填充,然后对数据进行解析和格式化。不允许用户编辑JTextPane
,但我希望他们能够使用可见光标在其中导航
如果我使用setEditable(false)
,光标是不可见的,尽管可以通过按住Shift并使用箭头键选择文本块来间接观察不可见光标的位置
为了在不允许编辑时启用可见光标,我创建了一个虚拟的DocumentFilter
,而不是setediate(false)
,它对其insertString()
、remove()
和replace()
方法不做任何操作。但是,为了以编程方式从文件中填充JTextPane
,我必须交换一个常规过滤器,然后在将控件返回给用户之前放回虚拟过滤器
到目前为止,这似乎是可行的,但有更简单的解决方案吗?如果我保持原样,是否有任何按键或鼠标活动序列可以让用户编辑文本窗格,因为它在技术上是可编辑的,按照
setEditable
?这可能是一个肮脏、肮脏的黑客行为,但我成功了
将文本窗格设置为不可编辑后,使用textPane.getCaret().setVisible(true)
重新启用插入符号
textPane.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
textPane.setEditable(true);
}
@Override
public void focusGained(FocusEvent e) {
textPane.setEditable(false);
}
});
又是一个肮脏的黑客!它似乎提供了你所需要的 使用isAPI扩展文档过滤器。如果为false,则阻止所有更改。当您需要以编程方式添加内容时,请设置标志,添加内容,然后将标志重置为false。这为我解决了问题(结合了前面的建议):
这种方法的问题在于,当焦点移动到另一个字段后,文本窗格中会留下一个闪烁的光标,这使得屏幕上同时出现多个闪烁的光标时看起来很奇怪。要避免这种情况,需要额外的代码在用户从一个字段导航到另一个字段时显示/隐藏插入符号。是的,您可能需要附加一个失去焦点的侦听器来禁用光标:P-您必须记住,您试图做的事情不是组件设计的,您必须对此承担一些责任;)我实现了这个的一个变体。我创建了一个类,它采用可选的DocumentFilter作为构造函数。每个
insertString()、remove()
和replace()
方法都会检查标志,根据标志的不同,它们要么不执行任何操作,要么将指令传递给构造时提供的过滤器(如果没有提供这样的过滤器,则传递给超类)。
textPane.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
textPane.getCaret().setVisible(true);
}
});