我不认为这是一个新问题。但是,只要使用退格键将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>
将导致在文本窗格中插入有序/无序列表。
此错误的奇怪部分如下:
一旦你开始删除这些字符(如果你碰巧在项目符号列表下方有行),这些字符将被删除,直到你点击最后一个项目符号的最后一个字符。一旦你达到这个目的,插入符号就会拒绝向上移动并且GlyphView的错误会被抛出。
有时会发生的事情是,在删除了大部分字符后 - 您仍然无法删除列表中的第一个项目符号。它只是挂起,直到你进行ctrl + a然后退格。
我已经在几乎所有基于Java的HTML编辑器中看到了这些错误,除了JWebEngine,这种行为不存在。不幸的是,JWebEngine不是开源的,因此我无法在他们的代码中查看他们如何解决这个问题。
我的猜测是来自HTML文档模型的通知存在一些问题,因为光标定位代码无法正常工作。我还搜索了Sun错误数据库以检查是否已经提出这个特定问题但是找不到任何问题(尽管我已经看到了很多与此非常相似的错误)。此外,我非常确定某人之前必须注意到这一点,并且必须将其引入Swing团队的注意力。
是否有人使用Swing(特别是文本)部分知道是否已向Sun提出此问题,或者是否已找到任何已知的解决方法来缓解此问题?
虽然用户仍然可以使用鼠标选择从窗格中删除列表,但是没有选择使用退格键执行相同操作只是看起来非常奇怪。
SSCCE现已附上。要重现这个错误。按照附图中所示的步骤进行操作。
观察到的行为:最后一颗子弹将挂起(不会被删除)并抛出异常(如上所述)
预期:没有异常,文本窗格的内容应该被清除。
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());
}
}
}
答案 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)