From 320f537a605ba117ed45f003130535ee1e91d3be Mon Sep 17 00:00:00 2001 From: tianmo Date: Fri, 16 Oct 2026 16:11:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AA=E4=BF=AE=E5=88=97=E8=A1=A8=EF=BC=9Abe?= =?UTF-8?q?ginRender=20=E6=94=B9=E5=9B=9E=E5=A4=8D=E7=94=A8=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=20Table=EF=BC=88=E6=8D=A2=E6=96=B0=20ScrollP?= =?UTF-8?q?ane=20=E4=BC=9A=E6=8A=9B=20InvocationTargetException=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=88=97=E8=A1=A8=E6=B8=B2=E6=9F=93=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=EF=BC=89=EF=BC=9Binvalidate=20=E5=90=8E=E5=86=8D?= =?UTF-8?q?=E8=B0=83=20ScrollPane(boolean,boolean)=3DsetForceScroll=20?= =?UTF-8?q?=E8=AE=A9=E5=AE=83=E6=8C=89=E6=96=B0=E5=86=85=E5=AE=B9=E9=AB=98?= =?UTF-8?q?=E5=BA=A6=E9=87=8D=E7=AE=97=E5=8F=AF=E6=BB=9A=E5=8A=A8=E8=8C=83?= =?UTF-8?q?=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- viewpanel/src/com/spineview/ObjectPanel.java | 27 +++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/viewpanel/src/com/spineview/ObjectPanel.java b/viewpanel/src/com/spineview/ObjectPanel.java index ec5e94e..4bce7a9 100644 --- a/viewpanel/src/com/spineview/ObjectPanel.java +++ b/viewpanel/src/com/spineview/ObjectPanel.java @@ -524,19 +524,9 @@ public final class ObjectPanel { * 加/删行,它记的高度还是旧的 —— maxY 一直是 0,滚轮就滚不动(你看到的现象)。 * 换一个新的 ScrollPane 最省事也最稳(只做这一件事,不改任何别的行为)。 */ + /** 每次渲染:清空列表里的旧行(复用同一个 Table / ScrollPane,避免换控件引起的异常)。 */ private static void beginRender(State state) throws Exception { - Object table = state.tableClass.getConstructor().newInstance(); - call(table, Obf.TABLE_TOP, new Class[0], state.tableClass); - call(table, Obf.TABLE_LEFT, new Class[0], state.tableClass); - Class skinClass = Class.forName("com.badlogic.gdx.scenes.scene2d.ui.Skin", true, state.loader); - Object scroll = state.scrollClass.getConstructor(state.actorClass, skinClass) - .newInstance(table, state.skin); - state.listTable = table; - state.listScroll = scroll; - if (state.listCell != null) { - // Cell.setActor(Actor):把旧 ScrollPane 换成新的 - call(state.listCell, "D", new Class[] {state.actorClass}, state.cellClass, scroll); - } + call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class[0], void.class); state.logBlockStarted = false; } @@ -551,6 +541,19 @@ public final class ObjectPanel { } catch (Throwable ignored) { // 同上 } + try { + // ScrollPane.setForceScroll(boolean, boolean):让它按新的内容高度重算可滚动范围 + for (Method method : state.listScroll.getClass().getMethods()) { + Class[] types = method.getParameterTypes(); + if (types.length != 2 || types[0] != boolean.class || types[1] != boolean.class) continue; + if (method.getReturnType() != void.class) continue; + method.setAccessible(true); + method.invoke(state.listScroll, Boolean.FALSE, Boolean.TRUE); + break; + } + } catch (Throwable error) { + System.err.println("[panel] 重算滚动范围失败: " + error); + } } /**