java - 如何在javafx中分离我的gui?

标签 java javafx

通常,当我创建 gui 时,我使用 swing 并创建我自己的扩展 jframe 的类。然后我创建一个 Controller 类并基于 mvc 设计我的程序。但我最近决定尝试一下 javafx,但我有点迷失了。

目前,我的所有 gui 都在我的主类中的 start 方法中,其中所有使用和引用的对象都被声明为我的主类中的字段。这看起来非常困惑并且没有正确实现。无论如何,有没有办法做我之前用 swing 和 javafx 所做的事情?

  • 我不想使用 fxml,也不打算使用它。

最佳答案

一般来说,你有一个主类来启动你的 GUI。 MVC 的 View 部分由 XML 文件(称为 FXML)处理。该 FXML 连接到 Controller 类。 JavaFX 还允许您直接将所有 GUI 组件注入(inject)到 Controller 内部的适当变量中,因此您无需查找它们。获取示例项目的最简单方法是使用 maven archetypes for JavaFX :

mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype

只需进入您项目所在的目录并输入上述命令即可。然后它会直接为您生成一个示例项目。那么让我们从主类开始

public class MainApp extends Application {

    private static final Logger log = LoggerFactory.getLogger(MainApp.class);

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

    public void start(Stage stage) throws Exception {

        log.info("Starting Hello JavaFX and Maven demonstration application");

        String fxmlFile = "/fxml/hello.fxml";
        log.debug("Loading FXML for main view from: {}", fxmlFile);
        FXMLLoader loader = new FXMLLoader();
        Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream(fxmlFile));

        log.debug("Showing JFX scene");
        Scene scene = new Scene(rootNode, 400, 200);
        scene.getStylesheets().add("/styles/styles.css");

        stage.setTitle("Hello JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }
}

如您所见,它只是加载 FXMl 并显示主窗口。 FXML 指定 GUI 的视觉结构(标签、文本字段、图像、按钮滚动条等)

<MigPane id="rootPane" fx:controller="example.HelloController" styleClass="main-panel" layout="insets 20" cols="[label, pref!][grow, 50::]" rows="" xmlns:fx="http://javafx.com/fxml">
    <Label text="First Name:" />
    <TextField fx:id="firstNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
    <Label text="Last Name:" /> <TextField fx:id="lastNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
    <Button text="Say Hello" onAction="#sayHello" MigPane.cc="skip, gap :push, gaptop 15, wrap" />
    <Label fx:id="messageLabel" styleClass="hello-message" MigPane.cc="span, growx, gaptop 15" />
</MigPane >

用于将 GUI 与其逻辑分离的 Controller 在 FXML 中指定,并且 fx:id 用于将元素直接注入(inject)到 Controller 内部的适当变量中

public class HelloController
{
    private static final Logger log = LoggerFactory.getLogger(HelloController.class);

    @FXML private TextField firstNameField;
    @FXML private TextField lastNameField;
    @FXML private Label messageLabel;

    public void sayHello() {

        String firstName = firstNameField.getText();
        String lastName = lastNameField.getText();

        StringBuilder builder = new StringBuilder();

        if (!StringUtils.isEmpty(firstName)) {
            builder.append(firstName);
        }

        if (!StringUtils.isEmpty(lastName)) {
            if (builder.length() > 0) {
                builder.append(" ");
            }
            builder.append(lastName);
        }

        if (builder.length() > 0) {
            String name = builder.toString();
            log.debug("Saying hello to " + name);
            messageLabel.setText("Hello " + name);
        } else {
            log.debug("Neither first name nor last name was set, saying hello to anonymous person");
            messageLabel.setText("Hello mysterious person");
        }
    }

}

Controller 具有带有 @FXML 注释的字段,这些字段是注入(inject)的 GUI 元素。正如您可以将变量名称等于 fx:id 一样,这是 JavaFX 注入(inject)元素所必需的。 要创建 FXML,您可以使用 Oracle Scene Builder或来自 Gluon 的两者都非常易于使用,并允许您快速生成漂亮的 GUI。

关于java - 如何在javafx中分离我的gui?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38470551/

相关文章:

Java多线程使用同步不是线程安全的

javafx - 如何创建带有 "Do not ask again"复选框的 JavaFX 警报?

JavaFX SetOnCloseRequest() 关闭所有屏幕

JavaFx:如何在创建 exe 时捆绑外部 jar

java - 加载您自己的 SecurityManager 或禁用现有的

Java设计模式: Facade

java - 在 kotlin 中沟通父类及其内部类的最佳方式是什么?

JavaFX:如何在TableView中选择和删除多个对象

java - 在新值(value)出现之前先弄清楚科学按钮

java - 基本接口(interface)说明