JAVAFX - 初学者的错误?

JAVAFX - beginner's mistake?

可能这只是初学者的错误,但每当我尝试创建一个新的 FXML 项目并将此示例代码添加到 main.java(示例由 Oracle 自己编写以显示示例,因此代码可以没错)我得到了异常错误。

但是!如果我删除这一行:

 private final Node rootIcon =  new ImageView(new Image(getClass().getResourceAsStream("root.png")));

而且我没有调用图片到根,代码运行良好! (但以防万一我在 .java 文件旁边有一个 root.png)

可能是什么原因?我确信 Oracle 没有编写无法运行的代码。

代码:

进口java.util.Arrays; 导入 java.util.List;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Test extends Application {
    List<Employee> employees = Arrays.<Employee>asList(
            new Employee("a1", "A"),
            new Employee("a2", "A"),
            new Employee("a3", "A"),
            new Employee("b1", "B"),
            new Employee("b2", "B"),
            new Employee("b3", "B"),
            new Employee("c1", "C"),
            new Employee("c2", "C"),
            new Employee("c3", "C"),
            new Employee("c4", "C"),
            new Employee("e1", "E"));
    private final Node rootIcon =  new ImageView(new Image(getClass().getResourceAsStream("root.png")));
    TreeItem<String> rootNode = new TreeItem<String>("Root",rootIcon);

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

    @Override
    public void start(Stage stage) {
        rootNode.setExpanded(true);
        for (Employee employee : employees) {
            TreeItem<String> empLeaf = new TreeItem<String>(employee.getName());
            boolean found = false;
            for (TreeItem<String> depNode : rootNode.getChildren()) {
                if (depNode.getValue().contentEquals(employee.getDepartment())){
                    depNode.getChildren().add(empLeaf);
                    found = true;
                    break;
                }
            }
            if (!found) {
                TreeItem depNode = new TreeItem(employee.getDepartment());
                rootNode.getChildren().add(depNode);
                depNode.getChildren().add(empLeaf);
            }
        }
        stage.setTitle("Tree View Sample");
        VBox box = new VBox();
        final Scene scene = new Scene(box, 400, 300);
        scene.setFill(Color.LIGHTGRAY);

        TreeView<String> treeView = new TreeView<String>(rootNode);
        treeView.setShowRoot(true);
        treeView.setEditable(true);
        box.getChildren().add(treeView);
        stage.setScene(scene);
        stage.show();
    }
    public static class Employee {

        private final SimpleStringProperty name;
        private final SimpleStringProperty department;

        private Employee(String name, String department) {
            this.name = new SimpleStringProperty(name);
            this.department = new SimpleStringProperty(department);
        }

        public String getName() {
            return name.get();
        }

        public void setName(String fName) {
            name.set(fName);
        }

        public String getDepartment() {
            return department.get();
        }

        public void setDepartment(String fName) {
            department.set(fName);
        }
    }
}

异常错误:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.javafx.main.Main.launchApp(Main.java:698)
        at com.javafx.main.Main.main(Main.java:871)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class Test
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:393)
        at com.sun.javafx.application.LauncherImpl.access[=12=]0(LauncherImpl.java:47)
        at com.sun.javafx.application.LauncherImpl.run(LauncherImpl.java:115)
        at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:276)
        ... 3 more
Caused by: java.lang.NullPointerException: Input stream must not be null
        at javafx.scene.image.Image.validateInputStream(Image.java:1001)
        at javafx.scene.image.Image.<init>(Image.java:624)
        at Test.<init>(Test.java:29)
        ... 8 more
Java Result: 1

您在加载图像时缺少包名称。只需使用以下内容:

new ImageView(new Image(getClass().getResourceAsStream("/packagename/root.png")));

这是必需的,仅当您的图像位于类路径中的某个子目录中时。