Вставьте изображение в рамку в качестве фона

Я хочу загрузить изображение в BorderPane. У меня есть статический метод Java, который усложняет для меня эту задачу:

private static final Image iv;    
    static {
        iv = new Image(StartPanel.class.getClass().getResource("/images/system-help.png").toExternalForm());
    }

public static void insert(){

     bp.setCenter(iv);
}

Подскажите, как правильно загрузить изображение?

P.S. это я понял

Executing com.javafx.main.Main from /home/rcbandit/Desktop/test/DX-57DC/dist/run1833589211/DX-57DC.jar using platform /opt/jdk1.7.0_25/bin/java
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.javafx.main.Main.launchApp(Main.java:642)
    at com.javafx.main.Main.main(Main.java:805)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.NullPointerException
    at com.dx57dc.stages.StartPanel.infrastructureIcon(StartPanel.java:241)
    at com.dx57dc.stages.StartPanel.navigationPanel(StartPanel.java:138)
    at com.dx57dc.stages.StartPanel.agentsPanel(StartPanel.java:78)
    at com.dx57dc.stages.Agents.agentsPanel(Agents.java:9)
    at com.dx57dc.main.DX57DC.initMainStage(DX57DC.java:287)
    at com.dx57dc.main.DX57DC.start(DX57DC.java:115)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
    ... 1 more
Java Result: 1

P.S 2 Мне удалось загрузить изображение с помощью этого кода:

    private static final ImageView iv;    
        static {
            iv = new ImageView(StartPanel.class.getResource("/com/dx57dc/images/6.jpg").toExternalForm());
        }

borderpane.setCenter(iv);

person Peter Penzov    schedule 10.08.2013    source источник
comment
Вы имеете в виду, как загрузить изображение в javafx или эту проблему, чтобы отобразить изображение?   -  person Dennis Kriechel    schedule 10.08.2013
comment
Может быть, у меня есть эти две проблемы.   -  person Peter Penzov    schedule 10.08.2013
comment
вы хотите, чтобы фон был в центре или он должен быть во всех областях?   -  person Dennis Kriechel    schedule 10.08.2013


Ответы (1)


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

borderpane.setStyle("-fx-background-image: url(\"/images/system-help.png\");-fx-background-size: 500, 500;-fx-background-repeat: no-repeat;")

Конечно, вы должны передать файл css на аутсорсинг и не использовать встроенные стили. Просто проще показать.

Если вы просто хотите установить фон центральной области, используйте это:

borderpane.getCenter().setStyle("-fx-background-image: url(\"/images/system-help.png\");-fx-background-size: 500, 500;-fx-background-repeat: no-repeat;")

Примечание.
system-help.png находится в каталоге /images, который находится на том же уровне, что и файл класса для приложения (например, при использовании eclipse он должен храниться в папке bin, что означает, что вы добавляете папку (например, вызываете это ресурсы) в свой проект и используйте его как source folder, в этой папке вам понадобится папка с изображением. Немного странно, но fx это нужно).

Изменить: изменить размер следующим образом:

private static final ImageView iv;    
static {
            iv = new ImageView(StartPanel.class.getResource("/com/dx57dc/images/6.jpg").toExternalForm());
            iv.resize(100, 100);
        }
person Dennis Kriechel    schedule 10.08.2013
comment
Я получаю NPE при загрузке изображения. Может быть, мне нужно использовать старый способ в моем посте. - person Peter Penzov; 10.08.2013
comment
как вы можете получить NPE? java fx никогда не выдает NPE при загрузке изображения через css, он просто игнорирует атрибут. Вы, должно быть, сделали что-то не так в другом месте - person Dennis Kriechel; 10.08.2013
comment
NPE будет выброшен, это borderpane равно нулю или borderpane.getCenter() равно нулю, это какая-то другая проблема, не имеющая отношения к загрузке изображения - person Dennis Kriechel; 10.08.2013
comment
mh, там особо не на что смотреть, можешь показать свой текущий код, на этот раз со свойством стиля? - person Dennis Kriechel; 10.08.2013
comment
bpi.getCenter().setStyle(-fx-background-image: url(\../images/6.jpg\); -fx-background-size: 500, 500; -fx-background-repeat: no-repeat ;); - person Peter Penzov; 10.08.2013
comment
Я обновил пост. Мне удалось загрузить изображение, но теперь мне нужно уменьшить изображение, потому что оно слишком велико. Как я могу это сделать, используя приведенный выше код? - person Peter Penzov; 10.08.2013
comment
В JavaFX2 я мог заставить: bp.setStyle("-fx-background-color: GREEN;"); работать, но bp.getCenter().setStyle("-fx-background-color: RED;"); не удалось. Я знаю, что вопрос был о стиле фонового изображения, но работал ли этот второй фрагмент выше в JavaFX 2? Похоже, вам должно быть разрешено устанавливать стиль на любом узле (с учетом ограничений CSS в: http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html ). - person gcbound; 12.03.2015
comment
Убедитесь, что вы установили локальный URL-адрес из каталога Classes, если вы используете netbeans, обычно он находится на один каталог выше, где находится фактически скомпилированный класс. - person NebDaMin; 16.04.2017