- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的JavaFX应用程序需要能够找到FXML文件,以便使用FXMLLoader
以及样式表(CSS文件)和图像来加载它们。当我尝试加载这些项目时,经常会出错,或者我尝试加载的项目根本无法在运行时加载。
对于FXML文件,我看到的错误消息包括
Caused by: java.lang.NullPointerException: location is not set
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
最佳答案
简短版答案:
getClass().getResource(...)
或SomeOtherClass.class.getResource(...)
为资源URL
/
)或相对路径(没有前导/
)传递给getResource(...)
方法。路径是包含资源的包,其中.
替换为/
。 ..
。如果并且当应用程序 bundle 为jar文件时,这将不起作用。如果资源不在该类的同一包或子包中,请使用绝对路径。 URL
直接传递到FXMLLoader
。 toExternalForm()
上调用URL
生成String
,以传递给Image
或ImageView
构造函数,或添加到stylesheets
列表中。 getClass().getResource(...)
创建资源URL Code cannot use
File
,FileInputStream
, orfile:
URLs to load a resource
FXMLLoader
明确希望将
java.net.URL
对象传递给它(传递给
static
FXMLLoader.load(...)
方法,传递给
FXMLLoader
构造函数或传递给
setLocation()
方法)。
Image
和
Scene.getStylesheets().add(...)
都期望表示URL的
String
。如果URL是在没有方案的情况下传递的,则它们将相对于类路径进行解释。通过调用
URL
上的
toExternalForm()
,可以以健壮的方式从
URL
创建这些字符串。
Class.getResource(...)
,它在适当的
Class
实例上调用。可以通过调用
getClass()
(给出当前对象的类)或
ClassName.class
获得此类实例。
Class.getResource(...)
方法采用代表资源名称的
String
。
/
分隔的路径名。每个组件代表一个包或子包名称组件。
.
and..
are not valid Java identifiers, so they cannot be used in resource names.
getResource()
实现的偶然事件。当应用程序 bundle 为jar文件时,它们将失败。
/
开头的资源名称是绝对的:换句话说,它们相对于类路径进行解释。没有前导
/
的资源名称将相对于调用
getResource()
的类进行解释。
getClass().getClassLoader().getResource(...)
。提供给
ClassLoader.getResource(...)
的路径始终是绝对路径,即它是相对于classpath的路径。
getClass().getResource()
创建资源URL
someClass.getResource(...)
。通常,
someClass
表示当前对象的类,并使用
getClass()
获得。但是,不一定要如此,如下一节所述。
// FXML file in the same package as the current class:
URL fxmlURL = getClass().getResource("MyFile.fxml");
Parent root = FXMLLoader.load(fxmlURL);
// FXML file in a subpackage called `fxml`:
URL fxmlURL2 = getClass().getResource("fxml/MyFile.fxml");
Parent root2 = FXMLLoader.load(fxmlURL2);
// Similarly for images:
URL imageURL = getClass().getResource("myimages/image.png");
Image image = new Image(imageURL.toExternalForm());
org.jamesd.examples.view
包中,并且我们需要加载在style.css
包中的CSS文件org.jamesd.examples.css
,则必须使用绝对路径: URL cssURL = getClass().getResource("/org/jamesd/examples/css/style.css");
scene.getStylesheets().add(cssURL.toExternalForm());
对于此示例,值得再次强调的是,路径"../css/style.css"
不包含有效的Java资源名称,如果应用程序 bundle 为jar文件,则将不起作用。FXMLLoader editorLoader = new FXMLLoader(EditorController.class.getResource("Editor.fxml"));
Parent editor = editorLoader.load();
FXMLLoader sidebarLoader = new FXMLLoader(SidebarController.class.getResource("Sidebar.fxml"));
Parent sidebar = sidebarLoader.load();
ImageView logo = new ImageView();
logo.setImage(newImage(SidebarController.class.getResource("logo.png").toExternalForm()));
mainScene.getStylesheets().add(App.class.getResource("style.css").toExternalForm());
例如,如果您有一个仅包含资源却没有类的包,则下面布局中的
images
包
package org.jamesd.examples.sample.images ;
public interface ImageLocation { }
现在,您可以轻松找到这些资源:
Image clubs = new Image(ImageLocation.class.getResource("clubs.png").toExternalForm());
从类的子包加载资源也相当简单。给定以下布局:
App
类中加载资源:
package org.jamesd.examples.resourcedemo;
import java.net.URL;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
URL fxmlResource = getClass().getResource("fxml/MainView.fxml");
FXMLLoader loader = new FXMLLoader();
loader.setLocation(fxmlResource);
Parent root = loader.load();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("style/main-style.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
要加载与要从中加载资源的类不在同一包或子包中的资源,需要使用绝对路径:
URL fxmlResource = getClass().getResource("/org/jamesd/examples/resourcedemo/fxml/MainView.fxml");
*.java
中的
src/main/java
文件被编译为类文件,这些文件将部署到build文件夹或jar文件中。 src/main/resources
中的资源被复制到构建文件夹或jar文件。 target/classes
中)由单个结构组成。
src/main/java
和
src/main/resources
均被视为构建中相应结构的根,因此,构建中仅包含其内容,而不是文件夹本身。换句话说,运行时没有
resources
文件夹。下面的“疑难解答”部分中显示了构建结构。
src/main/java
源文件夹与
src/main/resources
文件夹不同。在第一种情况下,它显示软件包,但对于资源文件夹,它显示文件夹。确保知道您是在IDE中创建包(名称为
.
分隔的)或文件夹(名称不得包含
.
或在Java标识符中无效的任何其他字符)。
.
或..
。 Class.getResource(...)
,如果路径具有前导/
,则该路径为绝对路径,否则为相对路径。对于ClassLoader.getResource(...)
,路径始终是绝对的。 target/classes
。其他构建工具和IDE将部署到名为
bin
,
classes
,
build
或
out
的文件夹中。
jar tf file.jar
从命令行检查内容:
$ jar -tf resource-demo-0.0.1-SNAPSHOT.jar
META-INF/
META-INF/MANIFEST.MF
org/
org/jamesd/
org/jamesd/examples/
org/jamesd/examples/resourcedemo/
org/jamesd/examples/resourcedemo/images/
org/jamesd/examples/resourcedemo/style/
org/jamesd/examples/resourcedemo/fxml/
org/jamesd/examples/resourcedemo/images/so-logo.png
org/jamesd/examples/resourcedemo/style/main-style.css
org/jamesd/examples/resourcedemo/Controller.class
org/jamesd/examples/resourcedemo/fxml/MainView.fxml
org/jamesd/examples/resourcedemo/App.class
module-info.class
META-INF/maven/
META-INF/maven/org.jamesd.examples/
META-INF/maven/org.jamesd.examples/resource-demo/
META-INF/maven/org.jamesd.examples/resource-demo/pom.xml
META-INF/maven/org.jamesd.examples/resource-demo/pom.properties
$
如果资源没有被部署或正被部署到意外的位置,请检查构建工具或IDE的配置。
关于javafx - 如何确定JavaFX应用程序所需的FXML文件,CSS文件,图像和其他资源的正确路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61582370/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!