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

JavaFX-11及其VSCode

符正信
2023-03-14

我一定错过了一些明显的东西。。。我正在试验VSCode(来自Eclipse),但是我无法让VSCode看到JavaFX11库。在导入语句中,对JavaFX组件的所有引用都标记为:

[Java] The import javafx cannot be resolved

在Eclipse中,这是通过“用户库”处理的,该库在.classpath中生成一个条目

<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11">
    <attributes>
        <attribute name="module" value="true"/>
    </attributes>
</classpathentry>

虽然VSCode似乎从Eclipse中理解了.classpath的其余部分,但它并不理解这一点。用磁盘上的实际位置替换path属性也不起作用。

为了清楚起见:

  • 这个问题是关于Java11的。在早期的Java版本中,JavaFX是JDK的一部分。在Java 11中,它已移动到一组外部模块。
  • 我不想使用Maven或Gradle。我需要直接引用模块而不使用构建工具

另外,如果VSCode也可以直接执行JavaFX应用程序,那就更好了。但是,如果我必须使用显式的模块和类路径从命令行启动应用程序,这是可以接受的

共有3个答案

颛孙沈义
2023-03-14

我想我找到了一个更简单的答案!

  1. 启动安装JDK的可执行文件,例如:jdk-8u201-windows-x64
  2. 重新安装并选择在本地安装额外的功能,包括JavaFX。

安装程序完成后,Visual Studio能够查看文件,访问不再受到限制。

如果这不起作用,我之前在排除故障时做了两件事(这两件事都没有解决问题,但其中一件可能会影响重新安装JDK的结果):

>

  • 我在JDK路径的末尾附加了一个斜杠,例如:"C:\Program Files\Java\jdk1.8。0_201\"

  • 东方方伟
    2023-03-14

    launch.json

    {
      // Use IntelliSense to learn about possible attributes.
      // Hover to view descriptions of existing attributes.
      // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
      "version": "0.2.0",
      "configurations": [
      {
            "type": "java",
            "name": "Launch Current File",
            "request": "launch",
            "mainClass": "${file}"
      },
      {
            "type": "java",
            "request": "launch",
            "vmArgs": "--module-path /Volumes/Data/kits/installations/javafx-sdk-15.0.1/lib --add-modules=javafx.controls,javafx.fxml,javafx.graphics",
            "mainClass": "application.Main",
            "name": "Launch Main",
            "projectName": "GooDay"
      }
      ]
    }
    

    将此添加到json设置中

     "java.dependency.packagePresentation": "hierarchical",
     "java.home":"/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home"
    
    凌炜
    2023-03-14

    我将从OpenJFX示例中运行Eclipse的HelloFX示例。

    使用VSCode打开示例后,我看到报告的错误:[Java]无法解析导入javafx[268435846]

    这显然意味着JavaFX类没有解析,即使. classpath文件中有一个条目:

    <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11"/>
    

    无法解析此库。

    解决JavaFX SDK

    因此,我将用本地JavaFX SDK中的实际罐替换该变量:

    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.base.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.graphics.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.controls.jar"/>
    <classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.fxml.jar"/>
    

    刷新项目后,我可以在JAVA依赖项下看到这些jar。

    虽然错误似乎已经解决,但项目仍然无法构建。

    解决JRE

    我们需要为项目设置JDK11,所以从这里下载。然后打开Eclipse并将其添加到已安装的JRE中。我在<代码>下看到Java-

    helloFX项目中的.classpath文件还包含对JRE的引用:

    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/
        org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JDK11">
        <attributes>
            <attribute name="module" value="true"/>
        </attributes>
    </classpathentry>
    

    因此,我将用JavaSE-11替换JDK11,并刷新项目。我可以在JAVA依赖项下看到对JRE系统库[JavaSE-11]的引用。

    解决JAVA_HOME问题

    我们需要在VSCode中设置java.home

    这可以在`首选项'中的settings.json中完成-

    {
       "java.dependency.packagePresentation": "hierarchical",
       "java.home":"/Users/<user>/Downloads/jdk-11.0.2.jdk/Contents/Home"
    }
    

    修改后,您将看到一个弹出窗口,显示消息Java语言服务器配置已更改,请重新启动VS-code.,因此重新启动它。

    试一试

    我们可以看到没有错误,甚至有一个包含生成结果的bin文件夹,而VSCode会自动生成该文件夹。

    我们能运行它吗?如果我们尝试一下,我们会得到一个错误:

    Error: JavaFX runtime components are missing, and are required to run this application
    

    这是使用JavaFX 11而不指定模块路径时出现的错误。

    解决VM参数

    最后一步包括添加所需的vm参数。

    这可以在launch.json文件中完成。它包含一个默认配置,我们可以修改该配置,为vmArgs添加一个新条目,包括带有JavaFX SDK本地路径的--module path,以及带有所需JavaFX模块的--add modules

    {
        "configurations": [
            {
                "type": "java",
                "name": "CodeLens (Launch) - Main",
                "request": "launch",
                "vmArgs": "--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib
                    --add-modules javafx.controls,javafx.fxml",
                "mainClass": "hellofx.Main",
                "projectName": "hellofx"
            }
        ]
    }
    

    现在一切都准备好了。

    再次运行该项目,它应该可以工作。

    请注意,我是第一次使用VSCode,所以我可能错过了一些明显的东西,也许其中一些步骤可以避免或简化。

     类似资料:
    • 我很难让IntelJ识别JavaFX包。对于一个新的JavaFX项目,使用OpenJDK11,当尝试构建项目时,IntelliJ无法识别JavaFX包。 我已经从Maven repo导入了。 我看过其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),项目语言是否正确(我的是)。 编辑: 错误:

    • 我有一个典型的问题:将JavaFX11与OpenJDK11和Eclipse IDE一起使用。 我有OpenJDK 11.0.2 然后,我将来自Eclipse IDE中的文件包含到一个库包中。

    • 问题内容: 我是Web编程的新手,正在做可以在网上找到的各种教程。 我做了研究,发现在int(11)中,11是整数的最大显示宽度,如果整数是UNSIGNED(在本例中为10),则它是默认值。 当我看到这样的东西: 我没问题 但是,为什么在不同的教程中看到不同的东西?例如,在某些情况下, 乃至 这些tut的作者试图达到什么目的?他们似乎都不想去解释10或4的含义。 好了,它们显然正在减小显示宽度,但

    • 问题内容: 我有一张卡,它由页眉,正文和页脚组成,可以由更多节点组成,例如标签,文本字段等。 当 卡内 发生单击时,无论何时是卡本身还是它的子代之一,我都需要捕捉事件。现在,如果我单击文本字段,则不会触发事件。 因此,就像上面的示例一样,如果我单击文本字段键入内容,则不会打印。 问题答案: 你可以用 这里描述了JavaFX中事件处理的完整机制。简而言之,事件具有 target ,在这种情况下, t

    • 我有一张卡片,它由页眉、正文和页脚组成,可以由更多节点组成,如标签、文本字段等。 我需要抓住鼠标点击事件的任何时间,当点击发生在卡内,无论它是卡本身还是其子卡之一。现在,如果我单击文本字段,事件不会被触发。 就像上面的例子一样,如果我单击文本字段来键入某些内容,未打印。

    • 试图使JavaFX11工作。 > 已下载JavaFX 11 在IntelliJ IDEA中创建JavaFX项目 运行->编辑配置->VM选项->--module-path=“path-to-javafx/javafx-sdk-11.0.1/lib”--add-modules=javafx.controls,javafx.fxml 出现错误: 我该怎么做才能让这件事成功?