JavaFX - 使用其他类作为节点

标签 java javafx

我是 JavaFX 的新手,很好奇是否可以在主启动函数中将您自己的类的对象作为节点添加到场景中?例如,我想在我的启动函数中创建一个根节点,然后向其添加一个按钮。不是在同一个启动函数中创建按钮,是否可以实例化一个对象,在其构造函数中创建自己的按钮,然后将其添加到根节点?这就是我的意思。我有两个正在使用的类。主要和酒吧。这是我的主要类(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 的黑框,但上面没有 Button。为什么?当我创建我的 Bar 对象(打开)时,它的默认构造函数创建了一个 Button。然后将该 Bar 对象作为子对象之一添加到我在 main 中的根对象。如果我的条形对象现在是根对象的子对象之一,并且场景中使用了根对象,那么当我启动应用程序时,条形对象的构造函数中的按钮不应该显示吗?

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

最佳答案

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

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

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

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

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

(2) 每个 UI 组件都由一个类表示,该类不是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 和 Controller 分离。用于构建 UI 的显式方法,因此可以在构建 UI 之前实例化和配置组件。
  • 缺点:使用起来比较复杂。

关于JavaFX - 使用其他类作为节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30313240/

相关文章:

javascript - 读取数据产生 null

java - Files.newInputStream 中的 NoSuchFileException 与 StandardOpenOption.CREATE

java - (错误)无法找到或加载主类

java - 在 JavaFX 中分组对象?

javafx - ControlsFX 通知中的粗体文本部分

button - TextField 为空时如何禁用按钮?

java - eclipseoxy版本中java 9中选择JRE运行环境

java - 如何从 Maven Checkstyle 插件检查中排除源根目录中的文件?

java - 计算按下按钮到执行一行代码之间的延迟的方法

java - 使用鼠标事件勾画 Shape3d javafx