不能 运行 Netbeans IDE 打包的浏览器中的简单 JavaFX
Can't run a simple JavaFX in a Browser packaged by Netbeans IDE
我创建了标准的 NetBeans JavaFX 应用程序,并尝试在浏览器中 运行 它,但没有成功。我已经按照那里的每条指示进行操作,但没有运气。我没有做任何特殊的、标准的 JavaFX,而是用 NetBeans IDE.
构建的
这是我收到的错误消息:
CacheEntry[file:/Users/mo/NetBeansProjects/WebAppTest/dist/WebAppTest.jar]: updateAvailable=false,lastModified=Fri Mar 04 07:03:31 EST 2016,length=19089
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:717)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:133)
at java.io.File.getAbsolutePath(File.java:556)
at webapptest.WebAppTest.start(WebAppTest.java:24)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:150)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:717)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:133)
at java.io.File.getAbsolutePath(File.java:556)
at webapptest.WebAppTest.start(WebAppTest.java:24)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
... 4 more
JavaFX 应用程序:
FXML 文件
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="webapptest.FXMLDocumentController">
<children>
<Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
</children>
</AnchorPane>
控制器:
public class FXMLDocumentController implements Initializable {
@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
label.setText("Hello World!");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
主要方法
public class WebAppTest extends Application {
@Override
public void start(Stage stage) throws Exception {
File f = new File("FXMLDocument.fxml");
String filePath = f.getAbsolutePath();
Parent root = FXMLLoader.load(getClass().getResource(filePath));
System.out.println(filePath);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
由于证书签名问题:我手动信任 dist\ 目录:
关于 FXML 文件,如果我没有执行 getAbsolutePath();我使用下面的行代码获取资源。我收到一条不同的错误消息:
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
如果我没有使用 getAbsolutePath(),我会收到以下错误:
updateAvailable=true,lastModified=Fri Mar 04 09:12:56 EST 2016,length=19089
java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at webapptest.WebAppTest.start(WebAppTest.java:26)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:150)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at webapptest.WebAppTest.start(WebAppTest.java:26)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
... 4 more
Here is the content of the Jar file:
问题是您被拒绝访问文件系统。
为了让您的小程序获得文件系统权限,它必须使用代码证书签名(这需要花钱),或者您需要在 Java 小程序策略文件中添加安全例外。
另见:
- Allow Java applet to file system access and recording without modifying java policy file?
- Default Policy Implementation and Policy File Syntax
- Creating a Trusted Applet with Local File System Access Rights
- What Applets Can and Cannot Do
自从您更新了您的答案后,您现在很清楚您真正想做什么。不要将 classpath 资源(通过 getClass().getResource()
检索)转换为文件,您应该直接使用该资源:
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
您根本不想处理 File
class,因为资源来自 JAR 文件内部。抛弃所有这些代码。
此外,请确保将 FXMLDocument.fxml
放入 webapptest
包中。如果您将它放在 class 路径的根目录下,请改用 .getResource("/FXMLDocument.fxml")
。
要包括评论中提到的内容:您可能需要清理并重建您的项目,以便正确显示资源。
我创建了标准的 NetBeans JavaFX 应用程序,并尝试在浏览器中 运行 它,但没有成功。我已经按照那里的每条指示进行操作,但没有运气。我没有做任何特殊的、标准的 JavaFX,而是用 NetBeans IDE.
构建的这是我收到的错误消息:
CacheEntry[file:/Users/mo/NetBeansProjects/WebAppTest/dist/WebAppTest.jar]: updateAvailable=false,lastModified=Fri Mar 04 07:03:31 EST 2016,length=19089
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:717)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:133)
at java.io.File.getAbsolutePath(File.java:556)
at webapptest.WebAppTest.start(WebAppTest.java:24)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:150)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:717)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:133)
at java.io.File.getAbsolutePath(File.java:556)
at webapptest.WebAppTest.start(WebAppTest.java:24)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
... 4 more
JavaFX 应用程序:
FXML 文件
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="webapptest.FXMLDocumentController">
<children>
<Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
</children>
</AnchorPane>
控制器:
public class FXMLDocumentController implements Initializable {
@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
label.setText("Hello World!");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
主要方法
public class WebAppTest extends Application {
@Override
public void start(Stage stage) throws Exception {
File f = new File("FXMLDocument.fxml");
String filePath = f.getAbsolutePath();
Parent root = FXMLLoader.load(getClass().getResource(filePath));
System.out.println(filePath);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
由于证书签名问题:我手动信任 dist\ 目录:
关于 FXML 文件,如果我没有执行 getAbsolutePath();我使用下面的行代码获取资源。我收到一条不同的错误消息:
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
如果我没有使用 getAbsolutePath(),我会收到以下错误:
updateAvailable=true,lastModified=Fri Mar 04 09:12:56 EST 2016,length=19089
java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at webapptest.WebAppTest.start(WebAppTest.java:26)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:150)
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at webapptest.WebAppTest.start(WebAppTest.java:26)
at com.sun.javafx.applet.FXApplet2.run(FXApplet2.java:134)
... 4 more
Here is the content of the Jar file:
问题是您被拒绝访问文件系统。
为了让您的小程序获得文件系统权限,它必须使用代码证书签名(这需要花钱),或者您需要在 Java 小程序策略文件中添加安全例外。
另见:
- Allow Java applet to file system access and recording without modifying java policy file?
- Default Policy Implementation and Policy File Syntax
- Creating a Trusted Applet with Local File System Access Rights
- What Applets Can and Cannot Do
自从您更新了您的答案后,您现在很清楚您真正想做什么。不要将 classpath 资源(通过 getClass().getResource()
检索)转换为文件,您应该直接使用该资源:
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
您根本不想处理 File
class,因为资源来自 JAR 文件内部。抛弃所有这些代码。
此外,请确保将 FXMLDocument.fxml
放入 webapptest
包中。如果您将它放在 class 路径的根目录下,请改用 .getResource("/FXMLDocument.fxml")
。
要包括评论中提到的内容:您可能需要清理并重建您的项目,以便正确显示资源。