Canvas Can';t在JavaFX画布上显示图像

Canvas Can';t在JavaFX画布上显示图像,canvas,intellij-idea,javafx,Canvas,Intellij Idea,Javafx,我刚刚开始涉足JavaFX领域,在尝试在画布上显示图像时遇到了一个问题。我在谷歌上搜索了几个小时,结果一无所获 这是我的代码(我在网上找到的): 它编译和运行良好,我没有发现任何异常,Hello World文本显示正确,但没有图像。我曾经尝试过绘制形状(如圆形和矩形),它们也可以正常工作,问题只是当我尝试显示图像时。System.out.println中的getWidth()和getHeight()调用都返回0.0 我使用的是IntelliJ Idea 2016.3.3 IDE,Java JDK

我刚刚开始涉足JavaFX领域,在尝试在画布上显示图像时遇到了一个问题。我在谷歌上搜索了几个小时,结果一无所获

这是我的代码(我在网上找到的):

它编译和运行良好,我没有发现任何异常,Hello World文本显示正确,但没有图像。我曾经尝试过绘制形状(如圆形和矩形),它们也可以正常工作,问题只是当我尝试显示图像时。System.out.println中的getWidth()和getHeight()调用都返回0.0


我使用的是IntelliJ Idea 2016.3.3 IDE,Java JDK 1.8.0_112,现在完全卡住了。非常感谢您的帮助。

您确定该文件存在吗?创建一个
文件
对象,检查
文件.exists()
的结果,将
文件.toURI().toString()
的结果传递给
图像
构造函数。谢谢。我按照你的建议做了,果然没有找到文件。我必须制定一条绝对路径才能让它发挥作用。你知道有没有使用相对路径的方法吗?我喜欢将我的资源与源代码放在一个单独的文件夹中,但我不知道使用什么作为路径。我试过“./res/earth.png”,但没用。如果我把图像放在源文件夹中,并将其称为“earth.png”@James_D,那么它也不起作用。我做了一些实验,找到了基本路径。从那里我可以看到我需要将src文件夹添加到路径中,因此我创建图像的新行是
earth=newimage(“file:src/res/earth.png”)非常感谢您的帮助。当然,如果图像将作为应用程序的一部分捆绑,那么使用文件可能不是最好的方法。这里有很多关于这个的问题。当我回到电脑前,我会看看是否能把它们挖出来。那将是一个很大的帮助,谢谢。
public class Main extends Application
{
  @Override
  public void start(Stage theStage)
  {
    theStage.setTitle( "Canvas Example" );

    Group root = new Group();
    Canvas canvas = new Canvas( 400, 400 );
    GraphicsContext gc = canvas.getGraphicsContext2D();

    gc.setFill( Color.RED );
    gc.setStroke( Color.BLACK );
    gc.setLineWidth(2);
    Font theFont = Font.font( "Times New Roman", FontWeight.BOLD, 48 );
    gc.setFont( theFont );
    gc.fillText( "Hello, World!", 60, 50 );
    gc.strokeText( "Hello, World!", 60, 50 );

    Image earth = null;
    try{
        earth = new Image("file:/res/earth.png");
    }catch(Exception e){
        System.out.println(e.toString());
    }

    System.out.println("height: "+earth.getHeight()+" width: "+earth.getWidth());
    gc.drawImage( earth, 180, 100 );

    root.getChildren().add( canvas );
    Scene theScene = new Scene( root );
    theStage.setScene( theScene );
    theStage.setResizable(false);
    theStage.show();

  }

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