Java Swing:删除有序/无序列表后的GlyphView:StateInvariantError(HTMLDocument)

时间:2012-01-29 19:36:26

标签: java swing jeditorpane htmleditorkit

我不认为这是一个新问题。但是,只要使用退格键将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>

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

此错误的奇怪部分如下:

  1. 一旦你开始删除这些字符(如果你碰巧在项目符号列表下方有行),这些字符将被删除,直到你点击最后一个项目符号的最后一个字符。一旦你达到这个目的,插入符号就会拒绝向上移动并且GlyphView的错误会被抛出。

  2. 有时会发生的事情是,在删除了大部分字符后 - 您仍然无法删除列表中的第一个项目符号。它只是挂起,直到你进行ctrl + a然后退格。

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

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

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

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

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

    1. 添加一行文字。然后单击文本窗格上方的按钮添加2/3项目符号项。现在将插入符号放在最后一个项目符号的最后一个字符的末尾,并继续按下整个退格键,直到所有字符都被删除。
    2. 观察到的行为:最后一颗子弹将挂起(不会被删除)并抛出异常(如上所述)

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

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

      TextPane bullet deletion problem

1 个答案:

答案 0 :(得分:1)

我用过这个

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

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

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