【问题标题】:Having a problem with a JavaFX extended Scene class if given extended class in constructor如果在构造函数中给定扩展类,JavaFX 扩展场景类会出现问题
【发布时间】:2021-09-19 16:56:47
【问题描述】:

我正在尝试创建一个作为 JavaFX 场景类扩展的类。但是,我想为该类的用户提供选项,以提供他们自己现有的 Scene 对象,然后该对象将获得作为扩展类一部分的附加代码。

这是我想做的一个基本示例:

public class MyScene extends Scene {

  public MyScene(Parent root, double width, double height) {
    super(root,width,height);
  }

  public MyScene(Scene scene) {
    super(scene.getRoot(), scene.getWidth(), scene.getHeight());
    //This does not work because two Scene objects cannot exist with the same Parent.
  }
}

很明显,上面的第二个类构造函数是行不通的。

我也试过这样做:

Scene scene = new Scene(parent);
MyScene myScene = (MyScene) scene;

但我收到一条错误消息,提示我无法将场景投射到 MyScene。

有什么办法可以做我想做的事吗?而我尝试这样做的唯一原因 - 这基本上是为了方便使用 MyScene 类的人,让他们可以选择预先构建他们的场景,然后使用 MyScene 类中的附加功能......它对整个班级来说只是一个“很好的接触”。

那么有没有办法“转换”或以某种方式将现有场景设置为在类中扩展的对象?

我查看了this question,但我无法真正理解如何将建议的解决方案应用于这种情况,特别是由于 javafx.scene.Scene 没有默认构造函数,因此在任何 MyClass 构造函数中调用 super 成为必需。

【问题讨论】:

  • 我不认为你想要的东西是可能的,但也许其他人可以看到我看不到的东西。
  • 可以使用decorator pattern代替子类化吗?
  • @trashgod 不幸的是,我认为Scene 也不可能。它具有不能在实例之间共享的状态(特别是root),并且查询该状态的方法不能被覆盖。
  • @Michael 请问,你为什么要继承Scene
  • @Slaw - 你问这个问题很有趣,因为我正在复习课程并亲自查看,我想这只是我在场景中引用各种属性和方法的方式班级。我决定改变这个类,使它不是场景的子类,然后我在类中添加了一个场景对象,并在类构造函数中实例化了一个新的场景对象,然后任何时候场景需要引用,我只引用那个对象它似乎工作正常。我认为这是我目前唯一的选择。

标签: java javafx


【解决方案1】:

根据我得到的反馈,看起来我想做的事情是不可能的,所以我决定重新构造这个类,让它看起来像这样:

public class MyScene {

  Scene scene;

  public MyScene(Parent parent, double width, double height) {
    this.scene = new Scene(parent, width, height);
  }

  public MyScene(Scene scene) {
    this.scene = scene;
  }

}

然后,当然,在需要对场景进行任何引用的地方,我只使用定义的场景对象。它让我可以提供我正在寻找的功能......虽然不理想,但它确实有效。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2013-01-30
    • 2013-11-15
    • 2019-01-07
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多