如何转换“javafx.scene.image”。Image@1a3d58b'到正常的文件路径
我在TilePane中列出了图像,单击每个图像时,应打印出其文件路径。然而,我得到了如下结果:如何转换“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 =
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);
}