У меня проблемы с установкой фонового изображения панели привязки динамически. Для целей разработки я помещаю внешние ресурсы в папку 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, как и все ссылки, кажется, не работает, так что будет правильным путем?
Нет, это определенно неправильно. String filename = "worldmap.jpg"; Услуги HostServices = getHostServices(); String url = services.resolveURI (services.getCodeBase(), "Resources/Wallpapers /" + filename); Вернет 'файл:/', и теперь, когда я тестировал это снова, кажется, он работает, мне интересно, почему он не работает до этого. –
Ну, определенно неправильно не подходит, потому что это по крайней мере работает на 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
Тогда это особенность на Mac. Altho в вашем примере строка приведет к тройной /, не уверен, что это повлияло. Но я обычно разрешаю java разрешать URI и URL-адреса, поэтому он должен быть прав для машины, в которой работает код. –