2016-07-24 7 views
2

Я пытаюсь сделать простое меню в JavaFX. При попытке загрузить изображение, используя относительный путь я получаю следующее исключение:Файл доступа Java за пределами пакета через относительный путь для загрузки как изображения (JavaFX)

Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found 
    at javafx.scene.image.Image.validateUrl(Image.java:1110) 

Я использую затмение, хотя эта проблема кажется быть не затмить конкретно, так как я получил такое же исключение при работе в терминале. Кроме того, по какой-то причине он работает, когда файл находится внутри пакета или в папке src (данный путь изменяется соответствующим образом).

Мой текущий активный класс Menu.java в пакете test.dsp, который находится в проекте как:

проекта/SRC/тест/ЦОС/Menu.java

Файл Я попытке доступа:

проекта/активы/графика/тест/дсп/sslogo.png

Я пытаюсь получить доступ к файлу в предположении, что этот путь относительно текущего Menu класса в Menu.java и из-за физические каталоги будучи project/src/test/dsp/Menu.java, я реализую ../ трижды в моем относительном пути, чтобы добраться до директории проекта. Затем я просто помещаю путь к изображению, как показано ниже.

Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png", 
      2000, 2000, true, true); 

I am basing my knowledge off of the constructor described in the JavaFX API:

public Image(java.lang.String url, 
    double requestedWidth, 
    double requestedHeight, 
    boolean preserveRatio, 
    boolean smooth) 

URL - строка, представляющая URL для использования в выборке пиксельных данных

Я искал через множество вопросов, но ответы на них не обеспечить решение для того, чтобы мой нынешний случай работал. Я пробовал getResource, getResourceAsStream и внешний ресурс. Я проверил URL-адрес, который был возвращен этими средствами, и никто не работал с моим предоставленным путем, как показано выше. Я также пробовал разные номера ../, но все равно безрезультатно. По общему признанию, я, возможно, реализовал их неправильно, что не привело к успеху.

  • Почему этот способ доступа к файлам через относительный путь не работает и как я могу сделать эту работу с моим текущим каталогом?

  • Каков правильный способ доступа к файлу через относительный путь в java вообще? И конкретно, когда файл находится вне пакета, например, этот случай?

    • есть ли способ включить файл в путь к файлу с помощью кода в классе java?
  • Эффективно ли иметь файл внутри пакета, или это не имеет значения (явно в зависимости от способа доступа к файлу за пределами пакета)?

    • Есть ли более эффективные средства доступа к файлам через java?

ответ

3

относительный путь в Java начинается в корневом каталоге вашего проекта (в вашем случае «проект» каталог), а не в классе, где называется URL. Таким образом, относительный путь к вашему файлу png будет «assets/graphics/test/dsp/sslogo.png».

Обычно пакеты не влияют на относительный путь.

Более эффективным способом является сохранение ваших изображений и других статических файлов, как и вы, в другом каталоге. Папка «src» зарезервирована для файлов .java.


Update:

Как сказано в этом посте: https://stackoverflow.com/a/16122215/6629388

Если вы не используете ПРОТОКОЛ как HTTP: или файла: в начале URL ресурс будет искать в пакете (по умолчанию). Таким образом, в вашем случае хороший способ получить ваш файл - использовать следующую строку:

Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true); 
+0

Я уже пробовал это без успеха. Любая причина, почему это не сработает? Возможно, мне не хватает чего-то невероятно простого, но я проверил это, и он не работает. Любые мысли, почему, были бы полезны. код ниже: Image ssLogo = новое изображение ("активы/графика/тест/дсп/sslogo.png", \t \t \t 2000, 2000, правда, правда); – prijatelj

+0

Конечно, мой вопрос оказывается дубликатом. Интересно, почему я не нашел этот вопрос ...> _ <Использование: "file: assets/graphics/test/dsp/sslogo.png" работает и решил проблему. Но я до сих пор не понимаю и хотел бы получить некоторые пояснения/подтверждения: Итак, используя «файл:» в начале моей строки URL, путь будет относиться к корневому каталогу проекта, в данном случае «проект», Верный? Если строка URL не содержит файл: или http :, то он ищет в пакете «по умолчанию»? Даже если я не использую пакет по умолчанию? или вы имеете в виду пакет класса? – prijatelj

+1

Когда вы используете протокол _file: _, путь является локальным для вашего компьютера, он может быть относительным или абсолютным (например: «файл: c: /users/Quentin/Desktop/myImage.png» или «файл: resources/images/myImage .png "). В случае относительного пути он будет относиться к корневому каталогу проекта. С протоколом _http: _ вы можете получить изображение в Интернете, но я думаю, что другие протоколы могут быть использованы. Если вы не используете протокол (например: «resources/images/myImage.png»), путь будет относиться к пакету по умолчанию. В вашем случае без протокола поиск изображения осуществляется по адресу «project/src/assets/graphics/test/dsp/sslogo.png» –