我一定错过了一些明显的东西。。。我正在试验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属性也不起作用。
为了清楚起见:
另外,如果VSCode也可以直接执行JavaFX应用程序,那就更好了。但是,如果我必须使用显式的模块和类路径从命令行启动应用程序,这是可以接受的
我想我找到了一个更简单的答案!
安装程序完成后,Visual Studio能够查看文件,访问不再受到限制。
如果这不起作用,我之前在排除故障时做了两件事(这两件事都没有解决问题,但其中一件可能会影响重新安装JDK的结果):
>
我在JDK路径的末尾附加了一个斜杠,例如:"C:\Program Files\Java\jdk1.8。0_201\"
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"
我将从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 出现错误: 我该怎么做才能让这件事成功?