#java #css #javafx #fxml
#java #css #javafx #fxml
Вопрос:
Я пытаюсь установить фоновое изображение программы JavaFX таким же, как фон пользователя.
Фоновое изображение в Windows находится в: «%AppData% Microsoft Windows Themes CachedFiles»
и с помощью JavaFX я добавил стиль, используя:
style="-fx-background-image: url('%AppData%MicrosoftWindowsThemesCachedFiles*.jpg');"
чем я должен заменить ‘* .jpg’ (зная, что там только 1 фотография)? или как я могу решить эту проблему?
Комментарии:
1. просто любопытно: почему вы не знаете его точное имя? по крайней мере, во время выполнения оно должно быть доступно или нет?
2. я хочу сделать так, чтобы у каждого человека, открывающего его, было свое фоновое изображение. таким образом, фоновое изображение приложения на моем компьютере будет отличаться от фонового изображения на вашем компьютере, если бы у нас были установлены разные фоны
3. Вы хотите, чтобы ваша программа выбирала случайный фон в папке CachedFiles?
Ответ №1:
Вы не можете сделать это только с помощью FXML. Вам нужно будет установить фон из контроллера после загрузки FXML.
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.Button?>
<AnchorPane fx:controller="stackoverflow.answers.demo.Main$Controller" fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextField fx:id="username" layoutX="30.0" layoutY="125.0" />
<Label layoutX="30.0" layoutY="99.0" text="Username" />
<Label layoutX="30.0" layoutY="174.0" text="Password" />
<PasswordField fx:id="password" layoutX="30.0" layoutY="200.0" />
<Button fx:id="login" layoutX="61.0" layoutY="338.0" mnemonicParsing="false" text="Login" />
</children>
</AnchorPane>
Код:
public class Main extends Application {
public static class Controller {
@FXML
AnchorPane mainPane;
@FXML
TextField username;
@FXML
PasswordField password;
@FXML
Button login;
}
public static void main(String[] args) {
launch(args);
}
private Optional<String> pickRandomImage() {
File[] imgs = Paths.get(System.getenv("APPDATA"), "Microsoft", "Windows", "Themes", "CachedFiles")
.toFile().listFiles((File f) -> f.getName().endsWith(".jpg"));
if (imgs != null amp;amp; imgs.length > 0) {
Collections.shuffle(Arrays.asList(imgs));
return Optional.of(imgs[0].toURI().toString());
}
return Optional.empty();
}
@Override
public void start(Stage stage) {
stage.setTitle("Random Background");
FXMLLoader loader = new FXMLLoader(getClass().getResource("/layout.xml"));
try {
Parent root = loader.load();
Controller ctrl = loader.getController();
pickRandomImage().ifPresent(imgurl -> {
Image image = new Image(imgurl);
ctrl.mainPane.setBackground(new Background(new BackgroundImage(image, BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT, BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
});
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Обратите внимание, что в моем примере будет выбрано случайное изображение из папки, если присутствует несколько изображений. Вы можете избавиться от этой части или оставить ее, поскольку это не повлияет на результат, если присутствует только одно изображение.