我现在想的只是一个简单的问题:
我有一个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
导致“找不到符号”错误。
我错过了什么?
2条答案
按热度按时间ifsvaxew1#
ScrollPaneSkin$4
很可能是scrollpaneskin中创建的匿名内部类的名称损坏示例。这可能就是为什么你的代码event.getTarget() instanceof ScrollPaneSkin
不起作用(因为目标实际上是匿名内部类的示例,而不是皮肤本身)。匿名类的作用域仅限于其父类,因此编译器必须为内部类生成一个“限定的”公共名称,以避免在同一命名空间中存在具有相同名称(内部或非内部)的其他类时发生冲突。类似地,匿名类必须为它们生成“假”公共名称(因为匿名类的概念只存在于编译器中,而不存在于运行时中)。因此,编译下面的java程序
将生成三个.class文件:
foo.class
,包含主(外部)类foofoo$bar.class
,包含命名的内部类foo.barfoo$1.class
,包含匿名内部类(本地到方法foo.zark)作为
ScrollPaneSkin
是一个com.sun
这是不受支持的公共api,编写基于它的代码可能不是一个好主意,因为它可能是脆弱的,容易出错,由于内部实现的scrollpaneskin,可能会改变从java到版本。我对你如何完成你想完成的事情没有进一步的建议。dbf7pr2w2#
好吧,我自己修的。问题很简单,原因很简单
$4
. 我刚发现$4
指向ScrollPaneSkin
显然不能从外面进入。这意味着目标并不是ScrollPaneSkin
而是一个内部类的示例。唯一的解决方法是使用event.getTarget.getClass().getName()
做一个字符串比较(解决方案(从这里开始)