为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Java没有在第二个场景中显示按钮

为什么Java没有在第二个场景中显示按钮

交互式爱情 2022-10-26 16:56:34
我的程序中有三个场景。当我启动它时,我看到了带有所有按钮的第一个场景。然后,当我进入第二个场景时,我只看到标签,按钮没有出现。在第三个场景中,一切正常,我看到了标签和按钮。所以问题是,为什么我的按钮没有出现在我的第二个场景中?我试着切换设置按钮和场景的顺序,让场景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);    }    }}那么,该死的虫子在哪里呢?我不明白。是某种 Java 或 JavaFX 巫毒术,您看不到第二个场景的按钮吗?
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


因此,如果您为每个布局创建唯一的 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()。


查看完整回答
反对 回复 2022-10-26
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

因此,这是一个只有一个场景、舞台和布局的工作示例。所有按钮都可以这样重复使用。这不是我通常喜欢的方式,但它可以工作并且使代码也更短。


package view.options;


import javafx.application.Application;

import javafx.application.Platform;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.Label;

import javafx.scene.layout.VBox;

import javafx.stage.Stage;


public class Options extends Application {

    // 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");


    VBox theOneAndOnlyLayout = new VBox(20);    

    Scene theOneAndOnlyScene;


    @Override

    public void start(Stage theOneAndOnlyStage) {

        theOneAndOnlyLayout.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;");


        theOneAndOnlyScene = new Scene(theOneAndOnlyLayout, 300, 250);


        theOneAndOnlyLayout.getChildren().setAll(optionslabel, volumeButton, resolutionButton, exitButton);


        optionsButton.setOnAction(e -> {

            theOneAndOnlyStage.setTitle("Options");

            theOneAndOnlyLayout.getChildren().setAll(optionslabel, volumeButton, resolutionButton, exitButton);

        });

        volumeButton.setOnAction(e -> {

            theOneAndOnlyStage.setTitle("Volume");

            theOneAndOnlyLayout.getChildren().setAll(volumelabel, saveButton, optionsButton);

        });

        resolutionButton.setOnAction(e -> {

            theOneAndOnlyStage.setTitle("Resolution");

            theOneAndOnlyLayout.getChildren().setAll(resolutionlabel, saveButton, optionsButton);

        });

        exitButton.setOnAction(e -> Platform.exit());

        saveButton.setOnAction(e -> Platform.exit());


        // Setup stage and start it

        theOneAndOnlyStage.setTitle("Options");

        theOneAndOnlyStage.setScene(theOneAndOnlyScene);

        theOneAndOnlyStage.show();

    }


    public static void main(String[] args) {

        launch(args);

        System.out.println("exited successfully!");

    }

}


查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信