修 Inspect 被日志覆盖:setStatus 改为只追加一行日志(不再触发整表重排),日志块用 logBlockStarted 标记

This commit is contained in:
tianmo committed 2026-10-16 16:06:48 +08:00
1 parent 8fefcb76c4
commit 0ec33d90ae
1 file changed
+31 -10
+31 -10
View File
@@ -42,7 +42,7 @@ public final class ObjectPanel {
Object nameField;
final java.util.Deque<String> log = new java.util.ArrayDeque<String>();
boolean rendering;
Runnable logPanelRefresh;
boolean logBlockStarted;
List<Object> objects = new ArrayList<Object>();
Object target;
}
@@ -112,12 +112,6 @@ public final class ObjectPanel {
cell = call(root, Obf.TABLE_ADD, new Class<?>[] {actorClass}, cellClass, scroll);
layoutCell(cell, Obf.CELL_TOP, Obf.CELL_EXPAND, Obf.CELL_FILL);
state.logPanelRefresh = new Runnable() {
@Override
public void run() {
refreshList(state);
}
};
wire(loader, refresh, new Runnable() {
@Override
public void run() {
@@ -188,13 +182,37 @@ public final class ObjectPanel {
return root;
}
/** 只往内容表格末尾追加**一行**日志(必要时先补一行分隔标记)。 */
private static void appendLogRow(State state, String text) {
try {
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
if (!state.logBlockStarted) {
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
cellClass, label(state.loader, state.skin, LOG_SEPARATOR));
layoutCell(cell, Obf.CELL_LEFT);
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
state.logBlockStarted = true;
}
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
cellClass, label(state.loader, state.skin, text));
layoutCell(cell, Obf.CELL_LEFT);
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
invalidateList(state);
} catch (Throwable error) {
System.err.println("[panel] 日志行追加失败: " + error);
}
}
private static final String LOG_SEPARATOR = "---------- log ----------";
/** 在内容表格末尾追加"日志块"(分隔行 + 最近几条消息)。 */
private static void appendLogRows(State state) {
try {
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
cellClass, label(state.loader, state.skin, "---------- log ----------"));
cellClass, label(state.loader, state.skin, LOG_SEPARATOR));
layoutCell(cell, Obf.CELL_LEFT);
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
synchronized (state.log) {
@@ -205,6 +223,7 @@ public final class ObjectPanel {
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
}
}
state.logBlockStarted = true;
} catch (Throwable error) {
System.err.println("[panel] 日志块追加失败: " + error);
}
@@ -242,6 +261,7 @@ public final class ObjectPanel {
try {
// Table.clearChildren()(载荷名 `SourceFile()V`):把列表里的行全清掉重建。
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
state.logBlockStarted = false;
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
for (int i = 0; i < objects.size() && i < 300; i++) {
@@ -402,6 +422,7 @@ public final class ObjectPanel {
private static void fillTextRows(final State state, List<String> lines) {
try {
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
state.logBlockStarted = false;
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
for (String line : lines) {
@@ -436,8 +457,8 @@ public final class ObjectPanel {
state.log.addLast(text);
while (state.log.size() > LOG_LINES) state.log.removeFirst();
}
// 没在渲染中就立刻把日志块刷出来(渲染中则由那次渲染带上,避免递归重排)
if (!state.rendering && state.logPanelRefresh != null) state.logPanelRefresh.run();
// 只追加一行日志:千万不要在这里重跑列表渲染,否则 Inspect 写好的字段清单会被覆盖
if (!state.rendering) appendLogRow(state, text);
}
/** TextField 里的文字(名字被混淆了,按"无参 + 返回 String"取)。 */