Java Swing:删除有序/无序列表后的GlyphView:StateInvariantEr
我不认为这是一个新问题.但是,只要使用退格键将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的错误会被抛出. 我已经在几乎所有基于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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |