我正在尝试将计算机文件夹图像加载到缩略图墙中。我从另一个论坛中读到了on a thread ImageView
“url”实例变量不支持系统路径。我尝试了那里的解决方案,但它引发了一个异常:java.lang.OutOfMemoryError: Java heap space as it keeps reading the file
。
另一个问题是它一直警告我使用包javafx.ext - > SwingUtils.toFXImage
方法。
我还尝试输入这样的网址:
"file://localhost//Users/USER/Pictures/Camera/test/1.JPG"
我试图显示许多图像,但它总是只显示3到4张图像。
我使用ImageView
给出的错误函数进行了检查,但它并未表示我的图像读取时遇到错误。
还有其他选择吗?
function load() {
println("RUNTIME {Runtime.getRuntime().maxMemory()}");
System.gc();
Runtime.getRuntime().freeMemory();
//MAC Folder PATH
var path: String = "/Users/username/Pictures/camera/test/1.JPG";;
var file: File = new File(path);
//http://download.oracle.com/docs/cd/E17802_01/javafx/javafx/1.3/docs/api/javafx.ext.swing/javafx.ext.swing.SwingUtils.html
//public toFXImage(image: java.awt.image.BufferedImage) : Image
//Creates a JavaFX Image from a BufferedImage.
img = SwingUtils.toFXImage(ImageIO.read(file));
}
答案 0 :(得分:27)
目前尚不清楚您正在尝试做什么。如果您正在谈论JavaFX 2.0,以下代码可以正常工作。如果要加载大量图像并需要节省内存,则只需为要一次显示的数字创建足够的ImageView。然后,当您翻阅图像时,可以换出 ImageView 中包含的图像对象。
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
File file = new File("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png");
Image image = new Image(file.toURI().toString());
ImageView iv = new ImageView(image);
root.getChildren().add(iv);
primaryStage.setScene(scene);
primaryStage.show();
}
答案 1 :(得分:5)
简单:用浏览器打开图像并复制图片的整个网址并将其粘贴为Image对象的参数。请勿删除“file ///:”,因为这会使图像可加载。你会从那里得到你的其他逻辑。快乐的编码,例如
Poly
答案 2 :(得分:2)
前代码:
File imageFile = new File("path/to/image/outside/your/jar/awesomeless.jpg");
String fileLocation = imageFile.toURI().toString();
Image fxImage = new Image(fileLocation);
或者你可以简单地把它们放在一起:
Image fxImage = new Image(new File("path/.../awesomemore.jpg").toURI().toString());
如果有人知道更好的方法,请告诉我们!
答案 3 :(得分:1)
另一个解决方案是将InputStream传递给Image类构造函数;并正在努力......
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
java.io.FileInputStream fis = new FileInputStream("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png");
ImageView iv = new ImageView(new Image(fis));
root.getChildren().add(iv);
primaryStage.setScene(scene);
primaryStage.show();
}
答案 4 :(得分:1)
以前的答案都不适合我。然而,这一个,我在一段时间后看到但无法找到原始链接,完美无瑕地工作。
@Override
public void start(Stage primaryStage) throws Exception {
//create a pane to hold the image views
Pane pane = new HBox(10);
pane.setPadding(new Insets(5,5,5,5));
//create the image to be used!
Image image = new Image("/Content/vortex.jpg");
//set some custom properties and add an image
ImageView imageView = new ImageView(image);
imageView.setFitHeight(100);
imageView.setFitWidth(100);
pane.getChildren().add(imageView);
//add the second image view with this image and no custom properties
pane.getChildren().add(new ImageView(image));
ImageView imageView2 = new ImageView(image);
imageView2.setRotate(45);
pane.getChildren().add(imageView2);
Scene scene = new Scene(pane, 200, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
关键是当你创建图像时,用'/'开始路径(即:“/Content/vortex.jpg”)。请注意,在此设置中,根文件夹是大多数IDE中的src文件夹。