由于缺乏特异性,我会提前道歉,但我不确定这是如何引起的。
我们有一个扩展javax.swing.text.DefaultStyledDocument中
如果我们做出迅速撤销/重做调用(比如,按住Ctrl + Z或按Ctrl + Shift + Z)一为XMLDocument,在AWT EventQueue的线程抛出一个例外:
javax.swing.text.BadLocationException: Length must be positive
getText():810, AbstractDocument {javax.swing.text}
getText():135, GlyphView {javax.swing.text}
getSpan():60, GlyphPainter1 {javax.swing.text}
getPreferredSpan():592, GlyphView {javax.swing.text}
getPreferredSpan():732, FlowView$LogicalView {javax.swing.text}
calculateMinorAxisRequirements():233, FlowView {javax.swing.text}
calculateMinorAxisRequirements():724, ParagraphView {javax.swing.text}
checkRequests():935, BoxView {javax.swing.text}
getMinimumSpan():568, BoxView {javax.swing.text}
calculateMinorAxisRequirements():903, BoxView {javax.swing.text}
checkRequests():935, BoxView {javax.swing.text}
setSpanOnAxis():343, BoxView {javax.swing.text}
layout():708, BoxView {javax.swing.text}
setSize():397, BoxView {javax.swing.text}
setSize():1714, BasicTextUI$RootView {javax.swing.plaf.basic}
modelToView():1046, BasicTextUI {javax.swing.plaf.basic}
repaintNewCaret():1311, DefaultCaret {javax.swing.text}
run():1290, DefaultCaret$1 {javax.swing.text}
dispatch():312, InvocationEvent {java.awt.event}
dispatchEventImpl():733, EventQueue {java.awt}
access$200():103, EventQueue {java.awt}
run():694, EventQueue$3 {java.awt}
run():692, EventQueue$3 {java.awt}
doPrivileged():-1, AccessController {java.security}
doIntersectionPrivilege():76, ProtectionDomain$1 {java.security}
dispatchEvent():703, EventQueue {java.awt}
pumpOneEventForFilters():242, EventDispatchThread {java.awt}
pumpEventsForFilter():161, EventDispatchThread {java.awt}
pumpEventsForHierarchy():150, EventDispatchThread {java.awt}
pumpEvents():146, EventDispatchThread {java.awt}
pumpEvents():138, EventDispatchThread {java.awt}
run():91, EventDispatchThread {java.awt}
现在,显然这是从AWT更新线程调用的。
它抛出了对实际元素是:
[4] = {[email protected]}"LeafElement(content) 223,217\n"
p0 = {[email protected]}"223"
p1 = {[email protected]}"217"
this$0 = {c[email protected]6211}
parent = {[email protected]}"BranchElement(paragraph) 191,238\n"
attributes = {[email protected]}"{family=Courier,size=12,foreground=java.awt.Color[r=0,g=0,b=0],}"
this$0 = {c[email protected]6211}
(来自的IntelliJ调试器获取)。
您可以看到p0和p1不正确。而且,该元件不应该存在由于[3]和[5]的数组中的元素相匹配的范围内:
[3] = {[email protected]}"LeafElement(content) 215,223\n"
[4] = {[email protected]}"LeafElement(content) 223,217\n"
[5] = {[email protected]}"LeafElement(content) 223,237\n"
我假设我缺少的同步,或SwingUtilities.runLater( ...)的调用,但我不知道在哪里,我已经把它们放在了我们可以在我们使用的撤消/重做类中想到的地方。
编辑:
这是编辑是如何被添加到的UndoManager:
public void undoableEditHappened(final UndoableEditEvent ev)
{
UndoableEdit edit = ev.getEdit();
// Include this method to ignore syntax changes
// To reduce memory consumption, do this check before adding runnable.
if (edit instanceof AbstractDocument.DefaultDocumentEvent &&
((AbstractDocument.DefaultDocumentEvent) edit).getType() ==
AbstractDocument.DefaultDocumentEvent.EventType.CHANGE)
{
return;
}
try {
UndoableEdit temp = ev.getEdit();
undoManager.addEdit(temp);
undoAction.updateState();
redoAction.updateState();
setChanged(true);
} catch (Exception e) {
e.printStackTrace();
}
}
编辑2:我发现大部分的我看到了一个功能,就是对的invokeLater是造成问题()runnable,它试图在撤消/重做事件之后语法突出显示文本。我担心即使它在EventQueue上,它也不会同步。是否有优先顺序或这些事件被解雇的顺序?
没有人可以帮你没有看到你的代码,我怀疑这是时间太长,张贴在这里。您将不得不设置一个异常断点并尝试在该行为中捕获它。 – 2014-09-03 21:41:37
我只能从AWT EventQueue线程获取异常,这就是我获取上面发布的信息的地方,没有其他异常抛出。 我知道这是一个长镜头,没有明显的测试用例,我的工作,看看我是否可以重新创建它(我工作的一个大型旧一段代码,没有人知道)。 我在找的是指针。 – 2014-09-03 22:14:37
您可以尝试在SwingUtilities.invokeLater()中包装所有撤销/重做调用。还有一点是检查UndoableEdits的存储方式。他们是否有DOM结构的副本或对结构的引用。复制更安全 – StanislavL 2014-09-04 05:29:30