加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Swing:删除有序/无序列表后的GlyphView:StateInvariantEr

发布时间:2020-12-15 02:31:14 所属栏目:Java 来源:网络整理
导读:我不认为这是一个新问题.但是,只要使用退格键将JTextPane中的有序/无序列表(EditorKit – HTMLEditorKit,Document – HTMLDocument)一直删除到顶部,就会出现错误.以下是GlyphView的getText()方法抛出的异常. Exception in thread "AWT-EventQueue-0" javax.s
我不认为这是一个新问题.但是,只要使用退格键将JTextPane中的有序/无序列表(EditorKit – > HTMLEditorKit,Document – > HTMLDocument)一直删除到顶部,就会出现错误.以下是GlyphView的getText()方法抛出的异常.

Exception in thread "AWT-EventQueue-0" javax.swing.text.StateInvariantError: GlyphView: Stale view: javax.swing.text.BadLocationException: Invalid location

我可以为此提供SSCCE.但是模拟起来并不是很困难.只需在其中使用带有HTMLEditorKit和HTMLDOcument模型的JTextPane.使用自定义“InsertOrderedList”操作或使用某种方式插入字符串

<HTML><HEAD></HEAD><BODY><UL><LI></LI></UL></BODY></HTML>

这将导致在文本窗格中插入有序/无序列表.

这个bug的奇怪部分如下:

>一旦你开始删除字符(如果你碰巧在项目符号列表下面有行),字符将被删除,直到你点击最后一个项目符号的最后一个字符.一旦你达到这个,插入符号就会拒绝向上移动并且GlyphView的错误会被抛出.
>有时会发生的事情是,在删除大部分字符后 – 您仍然无法删除列表的第一个项目符号.它只是挂起,直到您执行ctrl a然后退格.

我已经在几乎所有基于Java的HTML编辑器中看到了这些错误,除了JWebEngine,这种行为不存在.不幸的是,JWebEngine不是开源的,因此我无法在他们的代码中查看他们如何解决这个问题.

我的猜测是来自HTML文档模型的通知存在一些问题,因为光标定位代码无法正常工作.我还搜索了Sun错误数据库以检查是否已经提出这个特定问题但是找不到任何问题(尽管我已经看到了很多与此非常相似的错误).此外,我非常确定某人之前必须注意到这一点,并且必须将其引入Swing团队的注意力.

是否有人使用Swing(特别是文本)部分知道是否已经向Sun提出此问题,或者是否有任何已知的解决方法可以缓解此问题?

虽然用户仍然可以使用鼠标选择从窗格中删除列表,但是没有选择使用退格键执行相同操作只是看起来非常奇怪.

SSCCE现已附上.要重现这个错误.按照附图中所示的步骤操作.

>添加一行文字.然后单击文本窗格上方的按钮添加2/3项目符号项.现在将插入符号放在最后一个项目符号的最后一个字符的末尾,并继续按下整个退格键,直到所有字符都被删除.

观察到的行为:最后一颗子弹将挂起(不会被删除)并抛出异常(如上所述)

预期:没有异常,文本窗格的内容应该被清除.

public class Test {
    static final JFrame frame = new JFrame ();
    static final JTextPane textPane = new JTextPane ();

    static EditorKit kit;
    static JButton listButton;

    public static void createAndShowGUI () {
        //Create frame
        frame.setSize(400,600);
        frame.setVisible(true);
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);

        //Customize text pane visual properties
        textPane.setSize(300,500);
        textPane.setLocation(50,50);

        //customize text pane non visual properties
        kit = new CustomEditorKit ();
        textPane.setEditorKitForContentType("text/html",kit);
        textPane.setContentType("text/html");

        Action[] actions = ((HTMLEditorKit) kit).getActions();
        Action action = null;
        for (int i = 0; i < actions.length; i++) {
            action = actions [i];
            if (action.getValue(Action.NAME).equals("InsertUnorderedList")) {
                break;
            }
        }
        listButton = new JButton (action);
        listButton.setText("List");
        listButton.setSize(100,20);
        listButton.setLocation(100,10);
        listButton.setVisible(true);

        /* Add button and text pane to frame */
        frame.add(listButton);
        frame.add(textPane);
    }

    public static void main(String[] args) {
        try {
            EventQueue.invokeAndWait(new Runnable () {
                @Override
                public void run() {
                    createAndShowGUI ();
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    static class CustomEditorKit extends HTMLEditorKit {
        @Override
        public Document createDefaultDocument () {
            return new HTMLDocument (this.getStyleSheet());
        }
    }
}

解决方法

我用过这个

action=new HTMLEditorKit.InsertHTMLTextAction("test","<UL><LI><P>n</P></LI></UL>",HTML.Tag.BODY,HTML.Tag.UL);

而不是在您的示例中的默认操作,以提供正确的结构.

对我来说很好. (Win 7,Java 1.6)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读