当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中理解和使用``?

岳志义
2023-03-14
<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <fx:include fx:id="editorPane" source="editor.fxml"/>
</GridPane>
<?import javafx.scene.control.TextArea?>
<TextArea fx:id="editor" prefWidth="500" prefHeight="400" 
   fx:controller="sample.EditorController"
   xmlns:fx="http://javafx.com/fxml"/>

editor.fxml,使用fx:root:

<fx:root type="javafx.scene.control.TextArea"
     fx:id="editor" prefWidth="500" prefHeight="400"
     fx:controller="sample.EditorController"
     xmlns:fx="http://javafx.com/fxml"/>

实际上,我找不到这两种代码有什么不同。我错过什么了吗?

共有1个答案

冯澄邈
2023-03-14

为使用FXML定义可重用组件提供了解决方案

例如,假设您想定义一个简单的自定义组件,该组件由TextFieldButton包含在Hbox中。您需要用node的子类来表示,这样就可以编写如下代码

VBox vbox = new VBox();
vbox.getChildren().add(new MyComponent());

问题是您需要一个Java类,它是node的子类,以及FXML。在纯Java中(没有FXML),您可以使用:

public class MyComponent extends HBox {
    private TextField textField ;
    private Button button ;

    public MyComponent() {
        textField = new TextField();
        button = new Button();
        this.getChildren().addAll(textField, button);
    }
}
<HBox>
<TextField fx:id="textField"/>
<Button fx:id="button" />
</HBox>
public class MyComponent extends HBox {
    @FXML
    private TextField textField ;
    @FXML
    private Button button ;
    public MyComponent() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml"));
            loader.setController(this);
            HBox hbox = loader.load();
            this.getChildren().add(hbox);
        } catch (IOException exc) {
            // handle exception
        }
    }
}

这将导致MyComponent包含一个HBox包装,一个HBox包装TextField和Button。额外的、冗余的HBox是需要一个节点作为FXML根和一个节点来表示组件的结果。

提供了一种机制,用于将节点创建为组件(Java类),然后指示FXML文件使用该节点作为根:

<fx:root type="javafx.scene.layout.HBox">
<TextField fx:id="textField" />
<Button fx:id="button" />
</fx:root>

public class MyComponent extends HBox {
    @FXML 
    private TextField textField ;
    @FXML
    private Button button ;
    public MyComponent() {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MyComponent.fxml"));
            loader.setController(this);
            loader.setRoot(this);
            loader.load();
        } catch (IOException exc) {
            // handle exception
        }
    }
}
 类似资料:
  • 问题内容: 我是一个初学者,现在我想用java启动GUI应用程序。我开始阅读一些有关FX的书籍,但并未在JDK11上编译..我是否需要使用jdk8还是有什么办法可以在jdk11上完成? 问题答案: JavaFX已脱离JDK11(Oracle的官方JDK和OpenJDK)的捆绑。为了将JavaFX与JDK11结合使用,您必须下载独立的JavaFX11运行时。

  • 问题内容: 我想编写一个非常简单的Java 3D编辑器(用于实验)。我了解JavaFX的基本用法,并且了解足够的OpenGL知识。但是我所有的OpenGL经验都是来自使用C / C ++。 我可以在JavaFx应用程序中制作“画布”并在其上映射OpenGL视口吗? 问题答案: 在内部,JavaFX可以将OpenGL用作渲染管道,因此需要在两者之间进行一些集成以避免冲突。 JavaFX中的OpenG

  • 问题内容: 我已经安装好了。 JavaFX的下载页面显示以下内容: JavaFX 2.2.7包含最新的安全修复程序,并且与适用于Windows,Mac和Linux的最新JDK 7捆绑在一起。 使用JavaFX 2.2.7下载Java SE 7 像一个不错的菜鸟一样,我按照说明进行操作并安装了JDK。现在,当我寻找可以作为用户库导入到Eclipse的文件时,找不到了。JDK的文件夹中还有一些其他相关

  • 问题内容: Python 2.7+中是否存在一种进行以下操作的方法? 我知道您只要使用’if’就可以做任何事情: 问题答案: 您已经知道了:是有效的Python表达式。所示的dict理解的唯一问题是dict理解中表达式的位置必须有两个表达式,并用冒号分隔: final子句充当过滤器,这与具有条件表达式不同。

  • 问题内容: 因此,Scala应该和Java一样快。我正在重新研究最初在Java中解决的Scala Project Euler 问题。特别是问题5:“能被从1到20的所有数字均分的最小正数是多少?” 这是我的Java解决方案,需要0.7秒才能在计算机上完成: 这是我对Scala的“直接翻译”,需要103秒(长147倍!) 最后,这是我进行函数式编程的尝试,该过程需要39秒(长55倍) 在Window