From f8d2cda17c4f085c2e4c94a93ccee77fce21fc04 Mon Sep 17 00:00:00 2001 From: tianmo Date: Fri, 16 Oct 2026 16:31:48 +0800 Subject: [PATCH] =?UTF-8?q?grabScrollFocus=20=E6=94=B9=E7=94=A8=20getMetho?= =?UTF-8?q?ds()=EF=BC=9AStage=20=E7=9A=84=E7=84=A6=E7=82=B9=20API=20?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E5=9C=A8=E6=8E=A5=E5=8F=A3=E9=87=8C=EF=BC=88?= =?UTF-8?q?lpt6=20implements=20LPt9=EF=BC=89=EF=BC=8CgetDeclaredMethods=20?= =?UTF-8?q?=E6=89=AB=E4=B8=8D=E5=88=B0=EF=BC=88=E5=AE=9E=E6=B5=8B=20setter?= =?UTF-8?q?1/getter0=EF=BC=89=EF=BC=9B=E6=8E=92=E9=99=A4=20Actor/Group/Wid?= =?UTF-8?q?getGroup=20=E4=B8=8A=E5=A3=B0=E6=98=8E=E7=9A=84=E5=90=8C?= =?UTF-8?q?=E5=90=8D=E5=BD=A2=E7=8A=B6=E6=96=B9=E6=B3=95=E4=BB=A5=E5=85=8D?= =?UTF-8?q?=E8=AF=AF=E8=B0=83=20addActor?= 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 fecdb95..557f315 100644 --- a/viewpanel/src/com/spineview/ObjectPanel.java +++ b/viewpanel/src/com/spineview/ObjectPanel.java @@ -583,19 +583,22 @@ public final class ObjectPanel { Class actorClass = state.actorClass; java.util.List getters = new ArrayList(); java.util.List setters = new ArrayList(); - for (Class type = stage.getClass(); type != null && type != Object.class; - type = type.getSuperclass()) { - if (type.getName().equals(Obf.GROUP)) break; // 到 Group 就停(addActor 在这一层) - for (Method method : type.getDeclaredMethods()) { - Class[] types = method.getParameterTypes(); - if (types.length == 0 && actorClass.isAssignableFrom(method.getReturnType())) { - getters.add(method); - } else if (types.length == 1 && types[0].isAssignableFrom(actorClass) - && method.getReturnType() == void.class) { - setters.add(method); - } + // ⚠️ 必须用 getMethods()(含接口继承来的方法):Stage 的焦点 API 声明在接口里 + // (`lpt6 implements LPt9`),只看 getDeclaredMethods() 一个都扫不到(实测:setter 1 / getter 0)。 + // 但要排除声明在 Actor / Group / WidgetGroup 上的方法 —— 那里的 (Actor)V 是 addActor 之类,误调会把面板搬家。 + String[] skipDeclaring = {Obf.ACTOR, Obf.GROUP, Obf.WIDGET_GROUP}; + for (Method method : stage.getClass().getMethods()) { + String declaring = method.getDeclaringClass().getName(); + boolean skip = false; + for (String bad : skipDeclaring) if (declaring.equals(bad)) skip = true; + if (skip) continue; + Class[] types = method.getParameterTypes(); + if (types.length == 0) { + if (actorClass.isAssignableFrom(method.getReturnType())) getters.add(method); + } else if (types.length == 1 && types[0].isAssignableFrom(actorClass) + && method.getReturnType() == void.class) { + setters.add(method); } - if (type.getName().equals("dt")) continue; } for (Method setter : setters) { try {