javafx instanceof scrollpaneskin失败

wribegjk  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(329)

我现在想的只是一个简单的问题:
我有一个javafx应用程序,其中包含一个滚动窗格,我需要捕获该滚动窗格的mouseclicked事件。这本身实际上没有问题,只是如果事件目标是矩形、togglebutton或scrollpaneskin的示例,我只需要处理事件。我知道,这其实也很容易。现在,我有以下代码:

@FXML
void scrollPaneOnMouseClicked(MouseEvent event) {
    System.out.println(event.getTarget().getClass().getName());
    System.out.println(event.getTarget() instanceof  ScrollPaneSkin);
    if (event.getTarget() instanceof RoomRectangle || event.getTarget() instanceof ToggleButton || event.getTarget() instanceof ScrollPaneSkin) {
        // handle
    }
}

除了那个 event.getTarget() instanceof ScrollPaneSkin 说假的即使 System.out.println(event.getTarget().getClass().getName()); 输出 com.sun.javafx.scene.control.skin.ScrollPaneSkin$4 (调试器确认了这一点)。
我也试过了 event.getTarget() instanceof ScrollPaneSkin$4 导致“找不到符号”错误。
我错过了什么?

ifsvaxew

ifsvaxew1#

ScrollPaneSkin$4 很可能是scrollpaneskin中创建的匿名内部类的名称损坏示例。这可能就是为什么你的代码 event.getTarget() instanceof ScrollPaneSkin 不起作用(因为目标实际上是匿名内部类的示例,而不是皮肤本身)。
匿名类的作用域仅限于其父类,因此编译器必须为内部类生成一个“限定的”公共名称,以避免在同一命名空间中存在具有相同名称(内部或非内部)的其他类时发生冲突。类似地,匿名类必须为它们生成“假”公共名称(因为匿名类的概念只存在于编译器中,而不存在于运行时中)。因此,编译下面的java程序

public class foo {
    class bar {
        public int x;
    }

    public void zark () {
        Object f = new Object () {
            public String toString() {
                return "hello";
            }
        };
    }
}

将生成三个.class文件: foo.class ,包含主(外部)类foo foo$bar.class ,包含命名的内部类foo.bar foo$1.class ,包含匿名内部类(本地到方法foo.zark)
作为 ScrollPaneSkin 是一个 com.sun 这是不受支持的公共api,编写基于它的代码可能不是一个好主意,因为它可能是脆弱的,容易出错,由于内部实现的scrollpaneskin,可能会改变从java到版本。我对你如何完成你想完成的事情没有进一步的建议。

dbf7pr2w

dbf7pr2w2#

好吧,我自己修的。问题很简单,原因很简单 $4 . 我刚发现 $4 指向 ScrollPaneSkin 显然不能从外面进入。这意味着目标并不是 ScrollPaneSkin 而是一个内部类的示例。唯一的解决方法是使用 event.getTarget.getClass().getName() 做一个字符串比较(解决方案(从这里开始)

相关问题