JavaFX舞台/场景的子类化

4

我之前使用Swing,现在刚开始接触JavaFX,尝试对JavaFX的Stages和Scenes进行子类化。然而,很快就遇到了问题,比如我的子类场景的init方法在初始化时找不到。

所以我想知道:JavaFX的Stages和Scenes是否像在Swing中子类化JFrames和JPanels一样,或者这种做法被不鼓励?


我早就停止在我的Swing代码中大量使用JFrameJPanel的子类化了。大多数情况下,您只需实例化标准类并调用方法即可;我更喜欢这种方法。话虽如此,如果您想要,完全可以子类化StageScene并使用该方法。(唯一的例外可能是由JavaFX框架传递给启动方法Application.start()的初始Stage;如果您愿意,可以忽略它。)您指的是哪个init()方法?Scene没有定义init()方法。您能贴出一些代码吗? - James_D
Scene有两个私有的初始化方法,init()和init(double width, double height)。它们会在构造过程中被某种方式调用。您知道任何场景或舞台被子类化的例子(链接等)吗?我试图想出一个例子。 - Ueli Hofstetter
如果方法是私有的,你不能在子类中访问它们。但这并不妨碍你对Scene进行子类化。请参考示例。 - James_D
1个回答

4
您可以像对待其他FX库类一样,对SceneStage等进行子类化。我不确定是否建议这样做,也似乎没有在任何官方教程示例中出现过这种风格。(事实上,我早就停止在绝大多数swing代码中使用JFrameJPanel的子类,而更喜欢FX示例中的风格。)
但是这样做当然是可能的:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SubclassingExample extends Application {

    @Override
    public void start(Stage defaultStageIgnored) {
        Stage stage = new MyStage();
        stage.show();
    }

    public static class MyStackPane extends StackPane{
        public MyStackPane() {
            getChildren().add(new Label("Hello World"));
        }
    }

    public static class MyScene extends Scene {
        public MyScene() {
            super(new MyStackPane(), 250, 75);
        }
    }

    public static class MyStage extends Stage {
        public MyStage() {
            setScene(new MyScene());
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

你提到很久以前就停止使用 JFrameJPanel 的子类了。继承 StageScene 会对程序产生负面影响吗?谢谢。 - olimpiabaku
@olimpiabaku 过度使用继承是不好的编程实践。你应该为添加新功能而进行子类化,而不是为了在类上调用特定的API方法。如果您查看此(反)示例中的子类,它们所做的只是调用可以在现有类的实例上调用的方法。如果某种情况下需要,使用创建型模式更易于维护,其中您编写一个方法来实例化场景和舞台(在此示例中),并调用 getChildren().add(...)setScene(...) 等方法。 - James_D
我理解了,谢谢你的解释。我现在正在编写一个JavaFX项目,我的老师要求我们使用MVC模型,这就是为什么我考虑对它们进行子类化的原因。 - olimpiabaku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接