JavaFX - 使用其他 类 作为节点

JavaFX - Using Other Classes As Nodes

我是 JavaFX 的新手,很好奇是否可以将您自己的 classes 对象作为节点添加到主启动函数中的场景中?例如,我想在我的启动函数中创建一个根节点,然后向其添加一个按钮。不是在同一个启动函数中创建按钮,是否可以实例化一个对象,在其构造函数中创建自己的按钮,然后将其添加到根节点?这就是我的意思。我有两个正在使用的 classes。主要和酒吧。这是我的主要 class:

public class Main extends Application {
@Override
public void start(Stage primaryStage) {
    Group root = new Group();

    Bar open = new Bar();

    root.getChildren().add(open);

    Scene scene = new Scene(root, 1024,768, Color.BLACK);
    primaryStage.setScene(scene);
    primaryStage.show();
}

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

}

这是我的酒吧Class:

public class Bar extends BorderPane {

public Bar()
{
    Button btn = new Button("hey"); 
}

}

当我启动应用程序时,会打开一个 1024 X 768 的黑框,但上面没有按钮。为什么?当我创建我的 Bar 对象(打开)时,它的默认构造函数创建了一个 Button。然后将该 Bar 对象作为子对象之一添加到我在 main 中的根对象。如果我的条形对象现在是根对象的子对象之一,并且场景中使用了根对象,那么当我启动应用程序时,条形对象的构造函数中的按钮不应该出现吗?

在更大范围内,这通常是在 Javafx 中完成的吗?将所有内容都放在一个单独的 class 中并尽可能保持主启动函数的干净或者可以在该函数中实例化各种对象吗?非常感谢。

您必须将按钮作为子按钮添加到 Bar(实际上是 BorderPane):

public class Bar extends BorderPane {
    public Bar()
    {
        Button btn = new Button("hey");
        setCenter(btn);
    }
}

构建更大的 UIs 时通常有两种主要方法:

(1) 每个 UI-组件都是 Node 类型 的子 class(例如 BorderPane 作为在您的情况下)并在其构造函数中构建用户界面。 UI-组件是 JavaFX 场景图的一部分。

  • 优点:使用简单 - 只需实例化您的 class 并将其作为任何子节点放入场景图中。
  • 缺点:所有UI都是在构造函数中创建的。控制器代码是 UI.
  • 的一部分

(2) 每个 UI-组件都由 class 表示,即 而不是 子 class Node 类型。 相反,像 createUI(Pane parent) 这样的方法创建 UI 并将其放入场景图中。必须明确调用此方法。

示例:

public class Bar {
    public void createUI(Pane parent) {
        BorderPane pane = new BorderPane();
        Button btn = new Button("hey");
        pane.setCenter(btn);

        parent.getChildren().add(pane);
    }
}

在主应用程序的start(Stage)方法中:

Bar bar = new Bar();
bar.createUI(root);

当然,一个复杂的 UI-组件可能在内部使用其他 UI-组件并从它自己的 createUI(...) 方法中调用它们的 createUI(...) 方法。

  • 优点:UI和控制器分离。用于构建 UI 的显式方法,因此可以在 UI 构建 UI 之前 实例化和配置组件。
  • 缺点:使用起来比较复杂。