在 IntelliJ 中使用 MaterialFX

Using MaterialFX in IntelliJ

我一直在尝试在 IntelliJ 中使用 MaterialFX(这是一个 JavaFX 设计库(如 jFoenix)),但我没有成功。我已经添加了所需的依赖项:

此外,我在模块中添加了 requires org.glavo.materialfx.adapter;-info.java:

module org.example {
    requires javafx.controls;
    requires javafx.fxml;
    requires com.jfoenix;
    requires org.glavo.materialfx.adapter;

    opens org.example to javafx.fxml;
    exports org.example;
}

有谁知道我该如何使用这个库,因为作者并没有很好地解释如何使用。我想提一下,它在 Scene Builder 的最新版本中完美运行,所以我只是想知道为什么它在 IntelliJ 中不这样做。

使用Maven(或Gradle)进行依赖管理

您正在使用 Maven(至少 Idea 中的屏幕截图是这样,尽管它可能 Gradle 使用 Maven 存储库)。

您应该在 pom.xml(或 build.gradle)中将依赖项定义为 Maven 依赖项,然后将构建文件重新导入 Idea。

您不应该在 Idea 中手动设置库依赖项。

Idea和Maven会识别你有一个模块化的项目,当你在Maven中定义了依赖时,它们会自动将新的依赖模块放在modulepath中进行编译和执行。

可以通过搜索maven 存储库找到maven 工件:

依赖信息是:

<dependency>
  <groupId>io.github.palexdev</groupId>
  <artifactId>materialfx</artifactId>
  <version>11.13.5</version>
</dependency>

MaterialsFX 的 module-info 需要 VirtualizedFX。 VirtualizedFX 模块也需要在您的模块路径上。 MaterialsFX 的 pom.xml 文件包含对 io.github.palexdev:virtualizedfx:11.2.6 的依赖。因此,通过 Mavan 和 Idea 与 Java 平台模块系统的内置集成,您的构建和运行时将自动访问依赖模块。

需要正确的模块名称

库的模块名称不是 org.glavo.materialfx.adapter,而是 MaterialFX,因此您应该使用:

requires MaterialFX;

不是:

requires org.glavo.materialfx.adapter;

我建议您花一些时间学习构建工具和 Java 平台模块系统的教程。

示例应用程序

示例由 运行 想法 new JavaFX project wizard 创建,然后修改生成的项目。

pom.xml

除了对 MaterialFX 库具有依赖性之外,您还需要对 javafx-controls 和 javafx-fxml 都具有依赖性。

MaterialFX 在构建和运行时需要这两种传递方式(即使您不在应用程序中使用 fxml)。

MaterialFX pom.xml 没有 JavaFX 的显式依赖配置,因此您需要在项目 pom.xml 中定义这些依赖(您希望在无论如何确保您的应用程序使用特定的 JavaFX 版本)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>material</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>material</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>18</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>18</version>
        </dependency>
        <dependency>
            <groupId>io.github.palexdev</groupId>
            <artifactId>materialfx</artifactId>
            <version>11.13.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.9.0</version>
                <configuration>
                    <source>18</source>
                    <target>18</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

module-info.java

module com.example.material {
    requires MaterialFX;   
    exports com.example.material;
}

MaterialApplication.java

package com.example.material;

import io.github.palexdev.materialfx.controls.MFXButton;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MaterialApplication extends Application {
    @Override
    public void start(Stage stage) {
        stage.setScene(new Scene(new MFXButton("mfx")));
        stage.show();
    }

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