javafx access Изображение вне банки - PullRequest
0 голосов
/ 21 декабря 2018

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

Но теперь я хотел создать папку вне банки с необходимыми изображениями, потому что клиент должен изменить их позже.

Структура выглядит следующим образом:

dir:
 -program.jar
 -images:
    -picture.png
 -saves:
    -config.cfg

Я сбит с толку, так как могу загрузить конфигурацию с помощью

String path = "./saves/config.cfg";

Но при попытке получить доступ к изображению таким образом, я получаю неверный URL

Выполнение в соответствии с рекомендациями других не даетпохоже, работает хорошо:

File f = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
String path = f.getParent() + "images/picture.png"
Image image = new Image(path);

Все еще является недействительным URL, на этот раз с неизвестным протоколом: c

Установка "file:///" + в начале пути не будет работать, за исключением исключения, ноТакже нет изображения.

Любые идеи о том, как правильно получить доступ к изображению, и общие советы Мэйби для работы с ресурсами вне банки?

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете просто использовать относительный путь для объекта File:

File imageFile = new File("images/picture.png")

Ваш program.jar запустится в базовом каталоге;при создании объекта File это отправная точка для пути, который вы хотите передать конструктору.Поэтому new File("images/picture.png") будет искать файл pictures.png в подкаталоге «images».

Получив файл, вы захотите создать Image с использованием URI этого файла:

Image image = new Image(imageFile.toURI().toString());

Это фактически создает полный абсолютный путь к файлу.

Пример приложения:

Вот краткий пример того, чтоВы можете попробовать себя.Вам нужно убедиться, что у вас есть папка resources, созданная в вашей выходной папке (где находится файл .jar), а также подходящий для нее файл изображения.

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.File;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        // Just a box to put our image in
        VBox root = new VBox();
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Create our image. It is located in the "resources" folder of our application. We will first create a File
        // to represent the external resource.
        File imageFile = new File("resources/icon.png");
        Image image = new Image(imageFile.toURI().toString());

        // Add our image/ImageView to the scene
        root.getChildren().add(new ImageView(image));

        primaryStage.setTitle("External Images");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Это будет работать при запуске приложения в вашей среде IDE или после создания приложения JAR или JavaFX.

...