Creating image variable not working

2019-07-19 04:25发布

问题:

So I write the following code in eclipse:

package myProgram;

import com.sun.glass.ui.Screen;
import com.sun.prism.paint.Color;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application implements EventHandler<ActionEvent> {

Button btn1;
Button btn2;
Button btn3;

public float[] winSize = {200, 400};

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

@Override
public void start(Stage stage) throws Exception {
    VBox layout = new VBox(10);
    layout.setAlignment(Pos.CENTER);
    Scene scene = new Scene(layout, winSize[0], winSize[1]);

    Rectangle2D rect = javafx.stage.Screen.getPrimary().getVisualBounds();
    stage.setY(rect.getMinY() + rect.getHeight() - winSize[1]);
    stage.setX(rect.getMinX() + rect.getWidth() - winSize[0]);

    //Not working part below
    Image imageDecline = new Image(getClass().getResourceAsStream("image.png"));
    Button button5 = new Button();
    button5.setGraphic(new ImageView(imageDecline));
    //

    btn1 = new Button("Close");
    btn1.setOnAction(e -> stage.close());
    btn1.setStyle("-fx-font: 20 arial");
    layout.getChildren().add(btn1);
    btn1.setMaxWidth(160);
    System.out.print(System.getProperty("user.dir").toString());

    btn2 = new Button("Open new Win");
    btn2.setOnAction(e -> {

    });
    btn2.setStyle("-fx-font: 20 arial");
    layout.getChildren().add(btn2);
    btn2.setMaxWidth(160);

    btn3 = new Button("Alert");
    btn3.setOnAction(e -> {

    });
    btn3.setStyle("-fx-font: 20 arial");
    layout.getChildren().add(btn3);
    btn3.setMaxWidth(160);

    stage.setScene(scene);
    stage.show();
}
public void handle(ActionEvent event){

}
}

But it works if i delete this part:

//Not working part below
Image imageDecline = new Image(getClass().getResourceAsStream("image.png"));
    Button button5 = new Button();
    button5.setGraphic(new ImageView(imageDecline));
    //

I get the following text in the console and the program doesn't open up:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Input stream must not be null
    at javafx.scene.image.Image.validateInputStream(Unknown Source)
    at javafx.scene.image.Image.<init>(Unknown Source)
    at myProgram.Main.start(Main.java:45)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
    ... 1 more
Exception running application myProgram.Main

Does anyone have any idea why this problem arrives when i try to create a variable to hold/reference(not sure) an image with a .png format? I want to load an image and it is offline. And I can not understand how I would solve this from the answers in a similar questions, my file seems very different to me.

回答1:

Usually it is mismatch between requested resource name and existing resource. Especially when no folder/package is mentioned. Eclipse could see its own resources but deployed app may not have them.

Simple solution to eliminate such ambiguity would be to have folder in your resources and use this name directly. Like not image.png but /images/image.png

I would recommend to start resource name from the root to eliminate other relative confusions.

If you are still confused I'd recommend that you start to investigate what resources you have from within your app. List existing resources or try to access one what you think is here. Then you will have exception in your code and can easily see what is wrong.