gpt4 book ai didi

javax.swing.text.AbstractDocument$LeafElement 包含无效的 p0/p1 值

转载 作者:行者123 更新时间:2023-12-02 05:30:00 26 4
gpt4 key购买 nike

对于缺乏具体性,我提前表示歉意,但我不确定这是如何造成的。

我们有一个扩展 javax.swing.text.DefaultStyledDocument 的 XMLDocument

如果我们进行快速撤消/重做调用(例如,按住 ctrl+z 或 ctrl+shift+z),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] = {javax.swing.text.AbstractDocument$LeafElement@6621}"LeafElement(content) 223,217\n"
p0 = {javax.swing.text.GapContent$StickyPosition@6652}"223"
p1 = {javax.swing.text.GapContent$StickyPosition@6655}"217"
this$0 = {com.timetra.nms.client.gui.script.editor.document.XmlApiDocument@6211}
parent = {javax.swing.text.AbstractDocument$BranchElement@6585}"BranchElement(paragraph) 191,238\n"
attributes = {javax.swing.text.StyleContext$SmallAttributeSet@6656}"{family=Courier,size=12,foreground=java.awt.Color[r=0,g=0,b=0],}"
this$0 = {com.timetra.nms.client.gui.script.editor.document.XmlApiDocument@6211}

(取自 IntelliJ 调试器)。

如您所见,p0 和 p1 不正确。而且,该元素不应该存在,因为数组中的 [3] 和 [5] 元素与范围匹配:

[3] = {javax.swing.text.AbstractDocument$LeafElement@6620}"LeafElement(content) 215,223\n"
[4] = {javax.swing.text.AbstractDocument$LeafElement@6621}"LeafElement(content) 223,217\n"
[5] = {javax.swing.text.AbstractDocument$LeafElement@6622}"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() 可运行对象上的一个函数引起的,该函数尝试在撤消/重做事件后对文本进行语法突出显示。我担心即使它在 EventQueue 上它也不同步。这些事件的触发顺序是否有优先级或其他顺序?

最佳答案

您推断同步不正确的可能性是正确的。由于另一个线程上的错误文档更新,EDT 上可能会发生异常。一些methods在最近的 Java 版本中,某些文本组件不再标记为线程安全。按照引用的文章 here 中的建议,查找 EDT 违规行为。对于初始检查,CheckThreadViolationRepaintManager 是更简单的方法。

关于javax.swing.text.AbstractDocument$LeafElement 包含无效的 p0/p1 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25654035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com