Как я могу загрузить изображения каталога компьютеров в JAVAFX

Я пытаюсь загрузить изображения папок моего компьютера в стену миниатюр. Я прочитал в ветке другого форум, что переменная экземпляра ImageView url не поддерживает системные пути. Я пробовал использовать это решение, но оно вызывает исключение: java.lang.OutOfMemoryError: Java heap space as it keeps reading the file.

другая проблема в том, что он постоянно предупреждает меня об использовании пакета javafx.ext - ›SwingUtils.toFXImage method.

Я также попытался ввести такой URL-адрес:

"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));
}

person user1004413    schedule 20.10.2011    source источник


Ответы (5)


Непонятно, что именно вы пытаетесь сделать. Если вы говорите о JavaFX 2.0, следующий код работает. Если вы загружаете много изображений и вам нужно сэкономить память, вам нужно создать достаточно ImageView для того числа, которое вы хотите отображать за один раз. Затем, листая изображения, вы можете заменить объект Image, содержащийся в 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();
}
person JimClarke    schedule 11.11.2011
comment
Если бы я использовал изображение в папке того же dr, мог бы я передать ./imags/img.png в качестве значения новому File? - person Phil C.; 17.12.2015

Это просто: откройте изображение в браузере, скопируйте весь URL-адрес изображения и вставьте его в качестве параметра объекта Image. НЕ УДАЛЯЙТЕ «файл ///:», потому что это делает изображение загружаемым. оттуда вы получите другую логику. счастливого кодирования например

Image image = new Image("file:///C:/Users/Nigel/Desktop/my_image.png");
ImageView imgview = new ImageView(image);
person Flash    schedule 02.01.2016

извините, если мой ответ пришел немного поздно, но это был мой подход, и он работает на 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());

и, пожалуйста, дайте нам знать, если кто-нибудь знает лучший подход!

person Saïd Tahali    schedule 01.03.2016

Ни один из предыдущих ответов не помог мне. Однако этот, который я видел некоторое время назад, но не могу найти оригинальную ссылку, работает безупречно.

@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»). Обратите внимание, что в этой настройке корневая папка является папкой src в большинстве IDE.

person Daniel    schedule 27.03.2016
comment
Это совсем не ясно, вы не объяснили, что такое контекст папки, почему он существует и где по отношению к коду он размещен. - person Andrew S; 26.04.2019

Другое решение - передать 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();
}
person Sandeep Kumar    schedule 15.10.2014