重要信息和方法
所以我有了这个方法(目前还不完全),它的唯一目的是改变每一个屏幕中的背景图像。下面是这样做的方法。
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);
}
解决方案
这里是我想出的一个解决方案:
在我的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调试通知,其通知图标的背景有一个自定义的颜色。 有没有可能把那灰色换成别的东西?(以编程方式指定圆颜色)