我想有一个Java GUI库允许这样的东西:
Window window1 = new Window();
window1.show();
Window window2 = new Window();
window2.show();
...
但是JavaFX窗口需要在它自己的扩展Application的类中启动,并且不能多次实例化。
为什么JavaFX窗口不能像其他类一样实现?为什么它被称为应用程序而不是窗口或框架?为什么JavaFX打破了OOP?为什么我们必须使用混合反射的单身人士?我不想要魔法,我想在屏幕上出现一个OOP表现的窗口对象。
答案 0 :(得分:5)
但是JavaFX窗口需要在它自己的扩展Application的类中启动,并且不能多次实例化。
此语句错误,您可以在Window
类上调用构造函数时有限制,但它们与扩展Application
类无关。
为什么JavaFX窗口不能像其他类一样实现?
Window
类的构造函数受到保护,因此它可以是"used only within the package and in sub-classes outside the package"。
相反,在您的应用程序中,实例化一个类Window
的子类。要使用的适当类是Stage
。 constructors of Stage
是公开的而不是像Window
一样受保护。
因此,要显示两个阶段(即窗口),您可以写:
Stage stage1 = new Stage();
stage1.show();
Stage stage2 = new Stage();
stage2.show();
为什么它被称为Application而不是Window或Frame?
应用程序称为Application,因为它代表的是什么。在应用程序中,您可能有多个阶段(这是Windows的实例),因此将应用程序称为窗口是没有意义的。无论如何,应用程序有不同的目的:它的主要目的是实现应用程序生命周期接口和处理,如Application javadoc中所述。
为什么JavaFX打破了OOP?
它没有。它在Window上使用受保护的修饰符来强制encapsulation,这是OOP的一种关键隐藏技术。它通过inheritance提供Windows的子类用于不同的目的,例如Stages,它们是您的标准应用程序窗口,以及PopupWindows,它们是专门的窗口子集,可帮助执行诸如创建弹出列表之类的任务用于上下文菜单和组合框。它通过在不同的类结构中区分Application
和Window
功能来实现Separation of Concerns。
你的其他问题和陈述对我没有意义。