如何在JAVAFX中加载计算机目录图像

时间:2011-10-20 03:52:15

标签: image imageview javafx

我正在尝试将计算机文件夹图像加载到缩略图墙中。我从另一个论坛中读到了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));
}

5 个答案:

答案 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)

抱歉,如果我的回答有点晚,但这是我的方法,无论你把文件放在哪里都可以100%工作 1.将图像分配给文件 2.将文件解析为URI 3.将uri.toString()分配给图像

前代码:

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文件夹。