Java Source во многих каталогах выше - PullRequest
0 голосов
/ 20 октября 2018

У меня есть проект JavaFX со многими пакетами.Я хотел создать папку со всеми моими иконками внутри.путь к значку: src / icon / test.png и мой класс, где я пытаюсь инициализировать свое изображение, это: src / project / menus / ressources / settings / SettingWindow.java.Моя проблема в том, что я не могу попасть в корневую папку, в папку значков.

вот мой источник для SettingWindow:

package project.menus.ressources.settings;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class SettingWindow{

    @FXML private TextField nameTF;
    @FXML private Button pinButton;

    private Stage stage;


    public void setStage(Stage stage) {
        this.stage = stage;

/*-----------------Here where i try to initialize the Image -------------*/
        Image icon = new Image("file: /icon/test.png", 25,25, false, false);

        pinButton.setGraphic(new ImageView(icon));
    }
/*-----------------------------------------------------------------------*/ 
    public TextField getNameField() {
        return this.nameTF;
    }


}

"file: /icon/test.png" - не единственное, что я попробовал.я нашел где-то решение, чтобы получить корневой каталог с помощью getRoot (), но я не мог использовать этот метод.Я не могу использовать AbsolutPath для папки, потому что планируется использовать это программное обеспечение на разных компьютерах

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

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

Часто результаты компиляции сжимаются с ресурсами в файл jar.Содержимое файла JAR не доступно через файловую систему.Вместо этого вы должны использовать Class.getResource, получить URL ресурса и передать его конструктору Image.(Это работает, только если ресурсы доступны через classpath, но если они доступны, это работает независимо от того, упакованы они в банку или нет):

Image icon = new Image(SettingWindow.class.getResource("/icon/test.png").toExternalForm(),
                       25, 25, false, false);
0 голосов
/ 20 октября 2018

По моему опыту, наиболее гибкий подход для поиска ресурсов заключается в использовании InputStream и разрешении загрузчику классов найти объект.Таким образом, основываясь на утверждении, что ресурс (изображение) находится в папке src, и предполагая, что указанная папка src полностью добавлена ​​в путь к классам, может сработать что-то вроде следующего.

Примечание: я предполагаю, что .setGraphic(new ImageView(icon)) правильный - я не слишком знаком с JavaFX.

private void loadAndDisplayImage(Button btn) {
  final String name = "icon/test.png";
  ClassLoader cl = this.getClass().getClassLoader();

    //
    // use the try with resources, and allow the classloader to find the resource
    //   on the classpath, and return the input stream
    //
    try (InputStream is = cl.getResourceAsStream(name)) {
      // the javafx Image accepts an inputstream, with width, height, ratio, smoot
      Image icon = new Image(is, 25, 25, false, false);

      // should probably ensure icon is not null, but presumably if the resource
      //   was found, it is loaded properly, so OK to set the image
      btn.setGraphic(new ImageView(icon));
    }
    catch (IOException e) {
      e.printStackTrace();
    }
}

Затем вызовите метод loadAndDisplayImage(pinButton); из setStage(...)

Iдумаю, что этот подход немного более гибкий, чем попытка закодировать URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...