如何转换“javafx.scene.image”。Image@1a3d58b'到正常的文件路径

如何转换“javafx.scene.image”。Image@1a3d58b'到正常的文件路径,java,javafx,flowpane,Java,Javafx,Flowpane,我在TilePane中列出了图像,单击每个图像时,应打印出其文件路径。然而,我得到了如下结果: javafx.scene.image.Image@1a3d58b 如何获取以正常格式打印的路径,例如D:\Xampp\ 多谢各位 下面是课程: public class FlowTileExample extends Application { @Override public void start(Stage primaryStage) { VBox root =

我在TilePane中列出了图像,单击每个图像时,应打印出其文件路径。然而,我得到了如下结果:

javafx.scene.image.Image@1a3d58b
如何获取以正常格式打印的路径,例如D:\Xampp\

多谢各位

下面是课程:

public class FlowTileExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox(30);

        //loading images
        Image[] im = new Image[8];
        im[0] = new Image(getClass().getResourceAsStream("facebook.png"));
        im[1] = new Image(getClass().getResourceAsStream("faviicon.png"));
        im[2] = new Image(getClass().getResourceAsStream("jquery-logo.png"));
        im[3] = new Image(getClass().getResourceAsStream("linkedin_32.png"));
        im[4] = new Image(getClass().getResourceAsStream("loading1.png"));
        im[5] = new Image(getClass().getResourceAsStream("twitter.png"));
        im[6] = new Image(getClass().getResourceAsStream("twitter_32.png"));
        im[7] = new Image(getClass().getResourceAsStream("wp.png"));

        VBox up = new VBox(20);
        Text text4flow = new Text("Images in FlowPane");
        text4flow.setFont(Font.font("Calibri", FontWeight.BOLD, 30));
        text4flow.setUnderline(true);
        VBox.setMargin(text4flow, new Insets(10, 0, 0, 10));
        //creating Flow Pane
        FlowPane flowpane = new FlowPane();
        flowpane.setHgap(5);
        flowpane.setVgap(5);

        EventHandler mouseHandler = new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                ImageView imageView = (ImageView) t.getSource();
                System.out.println("You clicked " + imageView.getImage());
            }
        };

        for (int i = 0; i < 8; i++) {
            ImageView imageView = new ImageView(im[i]);
            imageView.setOnMouseClicked(mouseHandler);
            flowpane.getChildren().add(imageView);
        }

        up.getChildren().addAll(text4flow, flowpane);

        VBox down = new VBox(20);
        Text text4tile = new Text("Images in TilePane");
        text4tile.setFont(Font.font("Calibri", FontWeight.BOLD, 30));
        text4tile.setUnderline(true);
        VBox.setMargin(text4tile, new Insets(10, 0, 0, 10));

        //creating Tile Pane
        TilePane tilepane = new TilePane();
        tilepane.setHgap(5);
        flowpane.setVgap(5);
        for (int i = 0; i < 8; i++) {
            tilepane.getChildren().add(new ImageView(im[i]));
        }
        down.getChildren().addAll(text4tile, tilepane);
        root.getChildren().addAll(up, down);
        primaryStage.setTitle("Flow And Tile Panes Example");
        Scene scene = new Scene(root, 500, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
如果是正确的,则图像对象没有加载图像的文件的路径详细信息,并且不应该

如果你用它来演示一个演示项目,或者一个小项目,你在将来不考虑使用/升级,这里有一个小技巧。 试用

imageView.getImage().impl_getUrl()
这会还给你的

file:<your file path>

您可以创建一个类来封装您所拥有的信息以及图像,然后只需引用该类的实例。或者,更简单地说,为什么不:

String[] imageResources = new String[] {
    "facebook.png",
    "faviicon.png", 
    // etc
};

// ...

for (final String imageResource : imageResources) {
    Image image = new Image(getClass().getResourceAsStream(imageResource));
    ImageView imageView = new ImageView(image);
    imageView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("You clicked: "+imageResource);
        }
    });
    flowPane.getChildren().add(imageView);
}

这不能用你现在的方式来做。图像对象没有这些信息,并且您正在通过类加载器加载图像,因此您甚至无法将文件路径存储在查找表中以供以后使用。您好。谢谢你的回复。你介意告诉我怎么做吗?你的代码中已经有了路径名和资源名。您只需要保留对它们的引用,并在事件处理程序中使用它们。非常感谢您的回复和漂亮的回答。让我试试。@durron597是的,我知道,你是对的。我在发布答案时错过了警告。我添加了它以供将来参考!在任何情况下都不应该使用impl_*方法。它们是公共的,只是因为私有API需要能够访问它们,而不应被视为公共API的一部分。它们被标记为不推荐使用,以鼓励您不要使用它们,并且在API文档中被故意忽略。即使在JRE的一次小更新中,也不能保证它们会出现。@James_D是否有其他方法从图像对象本身获取图像路径?没有。通常,图像甚至不一定来自文件或其他资源;例如,它可能是动态创建的可写映像。由于OP在这里直接处理图像资源的名称,所以所需的只是处理事件处理程序中的名称。
String[] imageResources = new String[] {
    "facebook.png",
    "faviicon.png", 
    // etc
};

// ...

for (final String imageResource : imageResources) {
    Image image = new Image(getClass().getResourceAsStream(imageResource));
    ImageView imageView = new ImageView(image);
    imageView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.println("You clicked: "+imageResource);
        }
    });
    flowPane.getChildren().add(imageView);
}