gpt4 book ai didi

java - 为什么 Java 不在第二个场景中显示按钮

转载 作者:行者123 更新时间:2023-11-30 06:41:23 25 4
gpt4 key购买 nike

我的程序中有三个场景。当我启动它时,我会看到带有所有按钮的第一个场景。然后,当我转到第二个场景时,我只看到标签,没有显示按钮。在第三个场景中,一切正常,我看到了标签和按钮。

那么问题来了,为什么我的按钮没有出现在我的第二个场景中?

我试着调换设置按钮和场景的顺序,让场景2(音量)是第三个场景,第三个场景(分辨率)是第二个场景。每次第二个场景都没有显示按钮。

package view.options;

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Options extends Application {
Scene optionsMenu, volumeMenu, resolutionMenu;

// Create the labels
Label optionslabel= new Label("This is the options scene");
Label volumelabel= new Label("This is the volume scene");
Label resolutionlabel= new Label("This is the resolution scene");
Label labl_message = new Label("Volume settings");
Label labl_generalvolume = new Label("General volume");
Label labl_effectvolume = new Label("Effect volume");
Label labl_musicvolume = new Label("Music volume");

// Create the buttons
Button optionsButton= new Button("Go to options");
Button volumeButton= new Button("Go to volume settings");
Button resolutionButton= new Button("Go to resolution settings");
Button saveButton = new Button("save");
Button exitButton = new Button("exit");

// Create the sliders
Slider slider_generalvolume;
Slider slider_effectvolume;
Slider slider_musicvolume;

@Override
public void start(Stage optionsStage) {
// Setup the sliders
slider_generalvolume = new Slider();
slider_generalvolume.setMin(0);
slider_generalvolume.setMax(100);
slider_generalvolume.setValue(50);
slider_generalvolume.setShowTickLabels(true);
slider_generalvolume.setShowTickMarks(true);
slider_generalvolume.setBlockIncrement(10);

slider_effectvolume = new Slider();
slider_effectvolume.setMin(0);
slider_effectvolume.setMax(100);
slider_effectvolume.setValue(50);
slider_effectvolume.setShowTickLabels(true);
slider_effectvolume.setShowTickMarks(true);
slider_effectvolume.setBlockIncrement(10);

slider_musicvolume = new Slider();
slider_musicvolume.setMin(0);
slider_musicvolume.setMax(100);
slider_musicvolume.setValue(50);
slider_musicvolume.setShowTickLabels(true);
slider_musicvolume.setShowTickMarks(true);
slider_musicvolume.setBlockIncrement(10);

// Setup the main button
optionsButton.setOnAction(e -> optionsStage.setScene(optionsMenu));
volumeButton.setOnAction(e -> optionsStage.setScene(volumeMenu));
resolutionButton.setOnAction(e -> optionsStage.setScene(resolutionMenu));
exitButton.setOnAction(e -> Platform.exit());
saveButton.setOnAction(e -> Platform.exit());

// Setup the layout and add elements to it
VBox optionsLayout = new VBox(20);
optionsLayout.getChildren().addAll(optionslabel, volumeButton, resolutionButton, exitButton);
optionsLayout.setStyle("-fx-padding: 10;" +
"-fx-border-style: solid inside;" +
"-fx-border-width: 2;" +
"-fx-border-insets: 5;" +
"-fx-border-radius: 5;" +
"-fx-border-color: blue;");
optionsMenu = new Scene(optionsLayout, 300, 250);

VBox volumeLayout = new VBox(20);
volumeLayout.getChildren().addAll(volumelabel, saveButton, optionsButton);
volumeLayout.setStyle("-fx-padding: 10;" +
"-fx-border-style: solid inside;" +
"-fx-border-width: 2;" +
"-fx-border-insets: 5;" +
"-fx-border-radius: 5;" +
"-fx-border-color: blue;");
volumeMenu = new Scene(volumeLayout, 300, 250);

VBox resolutionLayout = new VBox(20);
resolutionLayout.getChildren().addAll(resolutionlabel, saveButton, optionsButton);
resolutionLayout.setStyle("-fx-padding: 10;" +
"-fx-border-style: solid inside;" +
"-fx-border-width: 2;" +
"-fx-border-insets: 5;" +
"-fx-border-radius: 5;" +
"-fx-border-color: blue;");
resolutionMenu = new Scene(resolutionLayout, 300, 250);

// Setup stage and start it
optionsStage.setTitle("Options");
optionsStage.setScene(optionsMenu);
optionsStage.show();
}

public static void main(String[] args) {
launch(args);
System.out.println("exited successfully!");
}
}

那么,该死的错误在哪里?我不明白。您看不到第二个场景的按钮是某种 Java 或 JavaFX 巫术吗?

最佳答案

问题来自 layout.getChildren().addAll(..., saveButton, optionButton)saveButtonoptionButton。 Java FX 节点仅限于最多 1 个父级和最多 1 个场景。尝试在多个地方使用它要么将其从旧父对象中删除,要么导致异常。在您的情况下,旧的 parent 被删除并被新的 parent 取代。为了使问题形象化,您可以更改布局初始化的顺序,这样,您将看到卷布局可以正常工作,但另一个不会。

因此,如果您为每个布局创建唯一的 saveButton 和 optionsButton 实例,它将起作用。

例子:

Button saveButtonVolume = new Button("save");
Button saveButtonResolution = new Button("save");

// ...

saveButtonVolume.setOnAction(e -> Platform.exit());
saveButtonResolution.setOnAction(e -> Platform.exit());

// ...

resolutionLayout.getChildren().addAll(resolutionlabel, saveButtonResolution, optionsButtonResolution);
volumeLayout.getChildren().addAll(volumelabel, saveButtonVolume, optionsButtonVolume);

遗憾的是,我没有找到任何方法来复制或克隆 Java FX 节点,这会简化问题(例如:saveButton.clone())。

关于java - 为什么 Java 不在第二个场景中显示按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883670/

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