当前位置: 首页 > 知识库问答 >
问题:

如何更改所有屏幕上的背景图像并保持更改

燕烨
2023-03-14

重要信息和方法

所以我有了这个方法(目前还不完全),它的唯一目的是改变每一个屏幕中的背景图像。下面是这样做的方法。

if(optionButton1.isArmed())
{
    optionButton1.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground1"));
}
else if(optionButton2.isArmed())
{
    optionButton2.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground2"));
}
else
{
    optionButton3.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground3"));
}
@FXML private StackPane Optionmenu;

这意味着optionmenu是此方法更改的FXML文件的主根。

我面临的一个挑战是找到一种方法,将所有节点或根都带到这个类中,如果可能的话,还可以更改这些节点的ID。

我试图解决这个问题:

   try
    {
        FXMLLoader myLoader = new FXMLLoader(getClass().getResource(MillionaireTriviaGame.MAIN));
        myLoader.load();
        mainMenu = myLoader.getRoot();
        mainMenu.setId("BlueBackground2")
    }
    catch (IOException ex)
    {
        Logger.getLogger(OptionscreenController.class.getName()).log(Level.SEVERE, null, ex);
    } 

代码时间

我想你们首先需要看到的是我是如何从屏幕过渡到屏幕的。会有很多代码要看,所以请耐心等待我,如果可以的话。

ScreenNavigator类-用于加载和设置屏幕

package millionairetriviagame;

import java.io.IOException;
import java.util.HashMap;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.StackPane;
import javafx.util.Duration;

public class ScreenNavigator extends StackPane
{

    private HashMap<String, Node> screens = new HashMap<>();

    public ScreenNavigator()
    {
        super();
    }

    public void addScreen(String name, Node screen)
    {
        screens.put(name, screen);
    }

    public Node getScreen(String name)
    {
        return screens.get(name);
    }

    public boolean loadScreen(String name, String resource)
    {
        try
        {
            FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
            Parent loadscreen = myLoader.load();
            ControllingScreens ScreenController = myLoader.getController();
            ScreenController.setScreenParent(this);
            addScreen(name, loadscreen);
            return true;
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
            return false;
        }
    }

    public boolean setScreen(String name)
    {
        if (screens.get(name) != null)
        {
            if (!getChildren().isEmpty())
            {

                Timeline transition = new Timeline(new KeyFrame(Duration.seconds(0.5), (ActionEvent event) ->
                {
                    getChildren().clear();
                    getChildren().add(screens.get(name));
                }));

                transition.play();
                MillionaireTriviaGame.fade(true);
            }
            else
            {
                getChildren().add(screens.get(name));
                MillionaireTriviaGame.fade(false);
            }
            return true;
        }
        else
        {
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error Dialog");
            alert.setHeaderText(null);
            alert.setContentText("The screen wasn't able to load.");

            alert.showAndWait();
            return false;
        }
    }
}
package millionairetriviagame;

import java.util.Optional;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class MillionaireTriviaGame extends Application
{
    private static final Rectangle fillRectangle = new Rectangle();
    public static final String MAINSCREENID = "main";
    public static final String MAIN = "MenulayoutFXML.fxml";
    public static final String OPTIONSCREENID = "option";
    public static final String OPTION = "Optionscreen.fxml";

    @Override
    public void start(Stage menuStage) throws Exception
    {
        ScreenNavigator controller = new ScreenNavigator();
        controller.loadScreen(MillionaireTriviaGame.MAINSCREENID, MillionaireTriviaGame.MAIN);
        controller.setScreen(MillionaireTriviaGame.MAINSCREENID);

        StackPane root = new StackPane();
        root.getChildren().addAll(controller, fillRectangle);
        root.setAlignment(Pos.TOP_CENTER);

        Scene scene = new Scene(root, 1366, 768);
        fillRectangle.setWidth(scene.getWidth());
        fillRectangle.setHeight(scene.getHeight());
        fillRectangle.setDisable(true);
        menuStage.setScene(scene);

        menuStage.setOnCloseRequest(e ->
        {
            Alert exitConfirmation = new Alert(Alert.AlertType.CONFIRMATION, "Are you sure you want to exit this application?");
            exitConfirmation.setTitle("Exit Application");
            exitConfirmation.setHeaderText("Confirm Exit");
            Optional<ButtonType> choice = exitConfirmation.showAndWait();
            if (choice.get() == ButtonType.OK)
            {
                menuStage.close();
            }
            else
            {
                e.consume();
            }
        });

        menuStage.setTitle("Let's play who wants to be a millionaire");
        menuStage.getIcons().add(new Image(getClass().getResource("/millionairetriviagame/ImageFiles/gameIcon.png").toExternalForm()));
        menuStage.setFullScreen(true);
        menuStage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

    public static void fade(boolean inOut)
    {
        FadeTransition ft = new FadeTransition(Duration.seconds(5), fillRectangle);
        ft.setFromValue(1);
        ft.setToValue(0);
        if (inOut)
        {
            ft.setDuration(Duration.seconds(0.5));
            ft.setFromValue(0);
            ft.setToValue(1);
            ft.setAutoReverse(true);
            ft.setCycleCount(2);
        }
        ft.play();
    }
}
package millionairetriviagame;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class OptionscreenController implements Initializable, ControllingScreens
{
    private ScreenNavigator controller;
    private MediaPlayer optionMenuPlayer;
    @FXML private Button backToMain;
    private BooleanProperty isDisabled;
    @FXML private StackPane Optionmenu;
    @FXML private Button optionButton1;
    @FXML private Button optionButton2;
    @FXML private Button optionButton3;

    @Override
    public void initialize(URL url, ResourceBundle rb)
    {
        configureProperties();
        playSong();
    }

    private void configureProperties()
    {
        isDisabled = new SimpleBooleanProperty();
        backToMain.disableProperty().bind(isDisabled);
    }

    @Override
    public void setScreenParent(ScreenNavigator parentScreen)
    {
        controller = parentScreen;
    }

    private void playSong()
    {
        Media optionIntroTheme = new Media(getClass().getResource("/millionairetriviagame/AudioFiles/OptionMenuMusic.mp3").toExternalForm());
        optionMenuPlayer = new MediaPlayer(optionIntroTheme);
        optionMenuPlayer.setAutoPlay(true);
        optionMenuPlayer.setVolume(0.1);
        optionMenuPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    }

    @FXML private void changeBackgroundScreen() // This is the method where it all happens.
    {
        if(optionButton1.isArmed())
        {
            optionButton1.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground1"));
        }
        else if(optionButton2.isArmed())
        {
            optionButton2.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground2"));
        }
        else
        {
            optionButton3.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground3"));
        }
    }

    @FXML private void goToTheMainMenu()
    {
        isDisabled.setValue(true);
        optionMenuPlayer.stop();
        controller.loadScreen(MillionaireTriviaGame.MAINSCREENID, MillionaireTriviaGame.MAIN);
        controller.setScreen(MillionaireTriviaGame.MAINSCREENID);
    }
}
package millionairetriviagame;

public interface ControllingScreens 
{
     public void setScreenParent(ScreenNavigator parentScreen);
}

共有1个答案

刘昌翰
2023-03-14

解决方案

这里是我想出的一个解决方案:

在我的screenNavigator类中,我添加了这个方法:

private String getBackgroundId()
{
    BufferedReader br = null;
    String backgroundId = "";

    try
    {
        br = new BufferedReader(new FileReader("Background.txt"));
        backgroundId = br.readLine();
    }
    catch (IOException e)
    {
        System.out.println(e.getMessage());
    }
    finally
    {
        try
        {
            if (br != null)
            {
                br.close();
            }
        }
        catch (IOException ex)
        {
           System.out.println(ex.getMessage());
        }
    }

    return backgroundId;
}
 mainMenu = myLoader.getRoot();
 mainMenu.setId(getBackgroundId());
private void changeBackgroundId(String backgroundId)
{
    BufferedWriter bw = null;

    try
    {
        bw = new BufferedWriter(new FileWriter("Background.txt", false));
        bw.write(backgroundId);
    }
    catch (IOException e)
    {
        System.out.println(e.getMessage());
    }
    finally
    {
        try
        {
            if (bw != null)
            {
                bw.close();
            }
        }
        catch (IOException ex)
        {
           System.out.println(ex.getMessage());
        }
    }

}
@FXML private void changeBackgroundScreen()
{
    if(optionButton1.isArmed())
    {
        optionButton1.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground1"));
        changeBackgroundId("BlueBackground1");
    }
    else if(optionButton2.isArmed())
    {
        optionButton2.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground2"));
        changeBackgroundId("BlueBackground2");
    }
    else
    {
        optionButton3.setOnMouseClicked(e-> Optionmenu.setId("BlueBackground3"));
        changeBackgroundId("BlueBackground3");
    }
}

这个解决方案的工作方式是,每次我从一个屏幕切换到另一个屏幕时,我将加载BackgroundDID文件中的唯一一行,那就是css文件中的id。一旦用户点击按钮更改背景(查看optionScreenController类),我就会写入文件,并用新Id覆盖旧Id,这样每个屏幕都会加载新的背景。这是解决我两个问题的好办法。如果其他人认为他们可以改进这个解决方案,请这么做。

 类似资料:
  • 我想在我的应用程序中使用背景图像。但是我对不同的屏幕大小感到困惑。我发现了这个问题: Android:支持所有设备的背景图像大小(以像素为单位) 但在回答中他说但Lg G3是和屏幕分辨率: 我需要一个路线图。所有屏幕的图像尺寸应该是多少?(mdpi、hdpi、xhdpi等)

  • 问题内容: 我有此jquery代码,可在单击时更改背景图像: 但是,它没有改变。有什么我想念的吗? 问题答案: 您需要包括该属性的一部分。

  • 问题内容: 如何在运行时更改CSS中的背景图片?我的体内有以下背景图像,可以在运行时更改图像吗? 问题答案: 如果已经加载了JQuery,则可以执行以下操作: 编辑 : 首先在head标签中加载JQuery: 然后,当页面上发生某些事情(例如加载完成时)时,调用Javascript更改背景图片:

  • 维护字体和颜色样式的最佳实践是什么。我制作了一个colors.xml文件,用于更改按钮等单独元素的颜色,但我不确定Android希望开发人员如何组织他们的样式。 例如,我希望所有屏幕都有相同的背景色。我该怎么做?我是否需要为每个活动布局xml指定一些内容?还是其他地方?我该如何完成它?

  • 我有一个带有文本块的div元素和一个父div,我在其中设置了一个背景图像。现在我想降低背景图像的不透明度。请建议我怎么做。 提前谢谢。 编辑: 我希望通过编辑 html 内容来改变我的博客文章看待 blogger.com 的方式。html 代码如下所示: 我试图用 div 元素包围上面的整个代码,并分别设置每个 div 的不透明度,如下所示: 但它不起作用。

  • 我在查看通知设计模式,没有发现任何关于通知图标背景的内容。正如您可能注意到的,自定义通知只有一个浅灰色背景。但是像Hangouts这样的应用程序,或者仅仅是USB调试通知,其通知图标的背景有一个自定义的颜色。 有没有可能把那灰色换成别的东西?(以编程方式指定圆颜色)