gpt4 book ai didi

java - 在窗口之间切换时如何阻止 JavaFx Slider 控件重置为其默认值

转载 作者:行者123 更新时间:2023-12-02 10:05:35 24 4
gpt4 key购买 nike

我有一堆在 SceneBuilder 中为 javafx 构建的 fxml 窗口。当我在设置窗口和主菜单之间切换时, slider (针对各种声音级别)重置为原始值,但是我希望它们保留上次打开窗口时的值。

我尝试过在初始化中设置值,并通过已更改的类设置变量并用于在启动时设置 slider ,但这也不起作用。

FXML

<!-- The slider code (scenebuilder forces me to choose a value) ->
<Slider fx:id="soundfxSlider" onMouseDragged="#updateSFX" showTickLabels="true" showTickMarks="true" snapToTicks="true" value="50.0" />
<Slider fx:id="musicSlider" minorTickCount="1" onMouseDragged="#updateMusic" showTickLabels="true" showTickMarks="true" snapToTicks="true" />

主菜单与其他窗口切换时访问的启动方法

static void launchScreen(String fileName) {
fileName = "/screens/" + fileName + ".fxml";
try {
Parent root = FXMLLoader.load(MainMenuController.class.getResource(fileName));
Scene scene = new Scene(root);
stage.setTitle("Fortress Combat");
stage.setScene(scene);
stage.show();
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(420);
});
} catch (IOException e) {
e.printStackTrace();
}
}

设置 Controller

public class SettingsController {

@FXML // fx:id="soundfxSlider"
private Slider soundfxSlider; // Value injected by FXMLLoader

@FXML // fx:id="musicSlider"
private Slider musicSlider; // Value injected by FXMLLoader

@FXML
void updateMusic(MouseEvent event) {
double musicVolume = musicSlider.getValue();
//setMusicSlider(musicVolume);
Launcher.adjustVolume(musicVolume);
}

@FXML
void updateSFX(MouseEvent event) {
double vol = soundfxSlider.getValue();
//setSoundfxSlider(vol);
Launcher.adjustSfx(vol);
}

private void setMusicSlider(double sliderVal) {
musicSlider.setValue(sliderVal);
}

private void setSoundfxSlider(double sfxVal) {
soundfxSlider.setValue(sfxVal);
}

@FXML
void playTestSfx(ActionEvent event) {
Launcher.playTestSFX();
}

@FXML
void goBack(ActionEvent event) {
Launcher.launchScreen("main_menu");
}

@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {
assert soundfxSlider != null : "fx:id=\"soundfxSlider\" was not injected: check your FXML file 'settings.fxml'.";
assert musicSlider != null : "fx:id=\"musicSlider\" was not injected: check your FXML file 'settings.fxml'.";
}

如果没有为 fxml 中的 slider 指定任何值,它们将采用默认值 0 - 似乎默认值是强制的,并且在切换窗口时它不会“记住”。

最佳答案

我相信我理解为什么当您打开窗口或者加载窗口时, slider 上总是会显示默认值。

如果您看一下下面的代码,我们会发现您通过使用作为参数给出的名称加载 FXML 来创建一个新的父级,然后将新场景设置到您的舞台。需要注意的关键一点是,您创建一个父级和场景,它不知道在其他场景中设置 slider 的任何值。

static void launchScreen(String fileName) {
fileName = "/screens/" + fileName + ".fxml";
try {
Parent root =
FXMLLoader.load(MainMenuController.class.getResource(fileName));
Scene scene = new Scene(root);
stage.setTitle("Fortress Combat");
stage.setScene(scene);
stage.show();
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(420);
});
} catch (IOException e) {
e.printStackTrace();
}
}

一些建议:

  1. 保存实际场景,然后如果文件名参数对应于已创建的场景,那么您可以真正“切换”场景而不是创建新场景。

下面是一个快速制作的示例,其中包含一个硬编码的 if 语句,这只是为了向您展示我的意思,但我相信您可以用更少的重复代码更好地解决它。

private Scene sceneA;

static void launchScreen(String fileName) {
if(fileName.equals("sceneA") && sceneA != null){
/*if we want to open up sceneA and it has been created before (meaning it's not null) then open the already existing scene.*/
stage.setTitle("Fortress Combat");
stage.setScene(sceneA);
stage.show();
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(420);
});

}else{
fileName = "/screens/" + fileName + ".fxml";
try {
Parent root =
FXMLLoader.load(MainMenuController.class.getResource(fileName));
Scene scene = new Scene(root);
stage.setTitle("Fortress Combat");
stage.setScene(scene);
stage.show();
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(420);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 建议 2 是将它们存储在某个地方,如果您希望它们持久存在,可以存储在某个处理程序类中或文件中。
  • 或建议 3,可能是在 Controller 中声明一些静态变量,当 slider 值发生更改时将其设置为 slider 的值。然后,您可以通过访问静态变量在初始化方法中设置 slider 值。
  • 不管怎样,这些都是我的想法,希望对你有帮助。让我们知道效果如何:)

    关于java - 在窗口之间切换时如何阻止 JavaFx Slider 控件重置为其默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55360993/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com