我试图将javafx程序的背景图像设置为与用户背景相同的图像。windows中的背景图像位于:“%appdata%\microsoft\windows\themes\cachedfiles”使用javafx,我添加了以下样式:
style="-fx-background-image: url('%AppData%\Microsoft\Windows\Themes\CachedFiles\*.jpg');"
我应该用什么替换“*.jpg”(知道那里只有一张照片)?或者我怎样才能解决这个问题?
vulvrdjw1#
单靠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 && 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); } } }
请注意,如果存在多个图像,我的示例将从文件夹中随机选取一个图像。你可以去掉那个部分,或者留下它,因为如果只有一个图像,它不会影响结果。
1条答案
按热度按时间vulvrdjw1#
单靠fxml是做不到的。加载fxml后,需要从控制器设置背景。
fxml地址:
代码:
请注意,如果存在多个图像,我的示例将从文件夹中随机选取一个图像。你可以去掉那个部分,或者留下它,因为如果只有一个图像,它不会影响结果。