2013-01-05 5 views
2

У меня проблемы с установкой фонового изображения панели привязки динамически. Для целей разработки я помещаю внешние ресурсы в папку dist проекта, поэтому файлы доступны.JavaFx задает внешнее фоновое изображение программно

Код для AnchorPane:

AnchorPane root = new AnchorPane(); 
// this works fine, styles inside the css are used in components on the root pane 
root.getStylesheets().add("file:/D:/ProjectFolder/global.css"); 

Что я не могу понять, как установить путь для фонового изображения. Чтение через ссылки CSS и JavaFX путь должен указываться относительно файла css. Я также пытался создать URL-адреса и URI и абсолютные пути.

// path of compiled jar 
"D:/ProjectFolder/project.jar" 
// path of css file 
"D:/ProjectFolder/global.css" 
// path of background file 
"D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg" 

Все они не работают:

root.setStyle("-fx-background-image: url('Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('./Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('@Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('@/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('@./Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
root.setStyle("-fx-background-image: url('file:/D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 

(на заметка на полях существуют файлы, я проверил имена папок и файлов для случая, это верно тоже)

Для тестирования цель:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class BackGroundTest extends Application { 

    private int backgroundtest = 0; 
    private AnchorPane root; 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Test Background"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       switch (backgroundtest) { 
        case 0: { 
         root.setStyle("-fx-background-image: url('Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 1: { 
         root.setStyle("-fx-background-image: url('/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 2: { 
         root.setStyle("-fx-background-image: url('./Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 3: { 
         root.setStyle("-fx-background-image: url('@Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 4: { 
         root.setStyle("-fx-background-image: url('@/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 5: { 
         root.setStyle("-fx-background-image: url('@./Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 6: { 
         root.setStyle("-fx-background-image: url('D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
        case 7: { 
         root.setStyle("-fx-background-image: url('file:/D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg'); -fx-background-repeat: stretch; -fx-background-size: stretch; -fx-background-position: center center;"); 
         break; 
        } 
       } 
       backgroundtest++; 
       if (backgroundtest == 8) {backgroundtest = 0;} 
      } 
     }); 
     root = new AnchorPane(); 
     root.getStylesheets().add("file:/D:/ProjectFolder/global.css"); 
     StackPane stack = new StackPane(); 
     root.getChildren().add(stack); 
     AnchorPane.setBottomAnchor(stack, 0d); 
     AnchorPane.setLeftAnchor(stack, 0d); 
     AnchorPane.setRightAnchor(stack, 0d); 
     AnchorPane.setTopAnchor(stack, 0d); 
     stack.getChildren().add(btn); 

     Scene scene = new Scene(root, 800, 600); 

     primaryStage.setTitle("Test Background"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * The main() method is ignored in correctly deployed JavaFX application. 
    * main() serves only as fallback in case the application can not be 
    * launched through deployment artifacts, e.g., in IDEs with limited FX 
    * support. NetBeans ignores main(). 
    * 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

CSS файл:

.button { 
    -fx-background-color: 
     rgb(0, 50, 0, 0.08), 
     rgb(0, 0, 0, 0.8), 
     #090a0c, 
     linear-gradient(#4a5661 0%, #1f2429 20%, #1f242a 80%), 
     linear-gradient(#242a2e, #23282e), 
     radial-gradient(center 50% 0%, radius 100%, rgba(135,142,148,0.9), rgba(255,255,255,0)); 
    -fx-background-radius: 7, 6, 5, 4, 3, 5; 
    -fx-background-insets: -3 -3 -4 -3, -3, 0, 1, 2, 0; 
    -fx-font-family: "Arial"; 
    -fx-font-size: 14; 
    -fx-text-fill: white; 
    -fx-padding: 5 10 5 10; 
    -fx-effect: dropshadow(one-pass-box , rgb(0, 255, 0, 0.6), 10, 0.5 , 0 , 1); 
} 

Все работает хорошо, если я включаю css и изображение в файл jar, но я хочу использовать внешние файлы. Установка пути относительно файла css, как и все ссылки, кажется, не работает, так что будет правильным путем?

ответ

1

Это похоже на работу сейчас, если я используйте это, чтобы поместить его в URL.

String filename = "worldmap.jpg"; 
HostServices services = this.getHostServices(); 
String url = services.resolveURI(services.getCodeBase(), "Resources/Wallpapers/" + filename); 

Результирующая строка такая же, как и в моем случае 7 Тхо, я не знаю, почему он не работал раньше, и теперь делает.

Я установил фон в конструкторе SceneController в первый раз, теперь я установил его в дополнительном методе, который вызывается после того, как сцена добавлена ​​на сцену, возможно, что-то нужно сделать, но я не могу фигурировать где ложь ошибается.

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

0

Не знаю, если вы получили это работает, но вот правильный ответ:

root.setStyle("-fx-background-image: url('file://D:/ProjectFolder/Resources/Wallpapers/worldmap.jpg');"); 

Реализация файл должен быть «файл: // PATH»

+0

Нет, это определенно неправильно. String filename = "worldmap.jpg"; Услуги HostServices = getHostServices(); String url = services.resolveURI (services.getCodeBase(), "Resources/Wallpapers /" + filename); Вернет 'файл:/', и теперь, когда я тестировал это снова, кажется, он работает, мне интересно, почему он не работает до этого. –

+0

Ну, определенно неправильно не подходит, потому что это по крайней мере работает на Mac: imageView.setStyle ("- fx-background-image: url ('file: //" + imagePath + "');"); (with imagePath = '/ Users/Toto/Workspace/MyProject/images/test.png ') тогда как это не работает: imageView.setStyle ("- fx-background-image: url (' file: /" + imagePath + "');"); – Badisi

+0

Тогда это особенность на Mac. Altho в вашем примере строка приведет к тройной /, не уверен, что это повлияло. Но я обычно разрешаю java разрешать URI и URL-адреса, поэтому он должен быть прав для машины, в которой работает код. –

Смежные вопросы