Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁用JTextPane中的编辑,同时允许可见光标移动_Java_Swing_Jtextpane - Fatal编程技术网

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);
    }
});