Почему значение случайной границы сбрасывается при смене сцены? - PullRequest
0 голосов
/ 01 февраля 2020

Я застрял на баге довольно долго. У меня есть два класса в JavaFX (Controller и Guessing Game). В контроллере у меня есть слайдер в сцене 3 в меню настроек. Я беру значение ползунка, когда пользователь перемещает его, и устанавливаю это значение в границах случайного числа. Но когда я переключаюсь обратно в Меню, а затем в сцену 2, значение границы возвращается к начальному значению 100. Проблема должна быть что-то между сценой 1-2. Кто-нибудь знает, почему значение сбрасывается обратно в 100, если я изменил это с ползунком на другое значение? Thx

Контроллер:

public class Controller {

    GuessingGame guessingGame = new GuessingGame();;

    @FXML
    private TextField textfield;
    @FXML
    private Label countText;
    public Label notification;
    public Label textBetween;
    @FXML
    public Slider sliderSettings;

    private int currentNumber;

    public void clickedOnExit() {
        System.exit(1);
    }

    ;

    public void clickedOnSettings() {
        Main.pStage.setScene(Main.scene3);
    }

    ;

    public void clickedOnPlay() {
        Main.pStage.setScene(Main.scene2);                          //Beim wechsel zu szene 2 wird der wert wieder auf 100 gesetzt
        System.out.println(guessingGame.getRandomBound());
    }

    ;

    public void clickedBackToMenu() {
        Main.pStage.setScene(Main.scene1);
    }

    ;

    public void clickedBackToMenuSettings() {
        Main.pStage.setScene(Main.scene1);
    }


    //SLIDER
    public void sliderSetValue() {
        guessingGame.setRandomBound((int) sliderSettings.getValue());
        System.out.println(guessingGame.getRandomBound());
    }

    ;

    public void enteredTextfield() {

        currentNumber = Integer.parseInt(textfield.getText());

        GuessingGame.Result checkNumber;

        //Setzt
        checkNumber = guessingGame.evaluateEnteredNumber(currentNumber);

        if (checkNumber == GuessingGame.Result.HIGHER) {
            notification.setText("HIGHER");
        }
        ;
        if (checkNumber == GuessingGame.Result.LOWER) {
            notification.setText("LOWER");
        }
        ;
        if (checkNumber == GuessingGame.Result.EQUALS) {
            notification.setText("YOU GOT IT!");
            textBetween.setText("Congratulations! The number was: " + guessingGame.getNumber());
        }
        ;
        textfield.clear();
        countText.setText("" + guessingGame.getCounter());  //Gibts ihr eine bessere Lösung?
    }
}

Игра на догадки:

import java.util.Random;

public class GuessingGame {

    Random rand = new Random();

    private int number;
    private int counter;
    //Variable die maxhöhe der Zufallszahl am Anfang auf 100 Stand
    private int randomBound = 100;

    public enum Result {
        EQUALS, HIGHER, LOWER
    }

    //Random number muss noch implementiert werden, sodass sie im Bound steht
    public GuessingGame() {
        getNumberToGuess();             //Konstruktor
    }

    public int getNumberToGuess() {
        this.number = rand.nextInt(randomBound);                 //im bound muss der wert vom slide sein
        return number;
    }

    //Methode für das Spielgeschehen gibt Das Ergebnis wieder obs höher/tiefer/gleich ist
    public Result evaluateEnteredNumber(int enteredNumber) {
        Result result;

        counter++;

        if (number > enteredNumber) {
            result = Result.HIGHER;
        } else if (number < enteredNumber) {
            result = Result.LOWER;
        } else {
            result = Result.EQUALS;
        }
        return result;
    }


    //----------------------------------------------------//
    //Getter und Setter//

    //Setter und Getter für die Zufallszahl
    public void setNumber(int  newNumber) {
        this.number = newNumber;
    }
    public int getNumber() {
        return number;
    }
    //Setter und Getter für den Versuchzähler
    public void setCounter(int newCounter) {
        this.counter = newCounter;
    }
    public int getCounter() {
        return counter;
    }
    //Setter und Getter für Die maxhöhe der Zufallszahl
    public void setRandomBound(int newRandomBound) {
        this.randomBound = newRandomBound;
    }
    public int getRandomBound() {
        return randomBound;
    }
}

Сцена 1:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>


<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Button fx:id="exitButton" layoutX="505.0" layoutY="349.0" mnemonicParsing="false" onAction="#clickedOnExit" prefHeight="37.0" prefWidth="81.0" text="Exit" />
      <Button fx:id="playButton" layoutX="237.0" layoutY="163.0" mnemonicParsing="false" onAction="#clickedOnPlay" prefHeight="37.0" prefWidth="126.0" text="Play" />
      <Button fx:id="settingsButton" layoutX="237.0" layoutY="213.0" mnemonicParsing="false" onAction="#clickedOnSettings" prefHeight="37.0" prefWidth="126.0" text="Settings" />
      <Label layoutX="66.0" layoutY="14.0" prefHeight="117.0" prefWidth="469.0" text="GUESSING GAME">
         <font>
            <Font name="Arial Black" size="49.0" />
         </font>
      </Label>
   </children>
</AnchorPane>

Сцена 2:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Label layoutX="72.0" prefHeight="20.0" prefWidth="457.0" text="GUESSING GAME">
         <font>
            <Font name="Arial Black" size="48.0" />
         </font>
      </Label>
      <Label layoutX="72.0" layoutY="187.0" text="Your guess:">
         <font>
            <Font name="Arial" size="22.0" />
         </font>
      </Label>
      <Label layoutX="395.0" layoutY="187.0" text="Attempts:">
         <font>
            <Font name="Arial" size="22.0" />
         </font>
      </Label>
      <TextField fx:id="textfield" layoutX="197.0" layoutY="188.0" onAction="#enteredTextfield" prefHeight="25.0" prefWidth="66.0" />
      <Label fx:id="countText" layoutX="496.0" layoutY="188.0" text="0">
         <font>
            <Font name="Arial" size="22.0" />
         </font>
      </Label>
      <Label layoutX="48.0" layoutY="71.0" text="My number is a random number up to 100! Try to guess it!">
         <font>
            <Font name="Arial Black" size="16.0" />
         </font>
      </Label>
      <Label fx:id="notification" layoutX="221.0" layoutY="120.0" text="Type a number!">
         <font>
            <Font name="Arial Black" size="22.0" />
         </font>
      </Label>
      <Label fx:id="textBetween" layoutX="72.0" layoutY="272.0" prefHeight="26.0" prefWidth="356.0" text="Your number is between 0 and 100">
         <font>
            <Font name="Arial Black" size="17.0" />
         </font>
      </Label>
      <Button fx:id="backToMenu" layoutX="485.0" layoutY="361.0" mnemonicParsing="false" onAction="#clickedBackToMenu" text="Back to Menu" />
   </children>
</AnchorPane>

Сцена 3:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Slider fx:id="sliderSettings" layoutY="200.0" max="1000.0" minorTickCount="4" onMouseReleased="#sliderSetValue" prefHeight="38.0" prefWidth="592.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" value="100.0" />
      <Label layoutX="4.0" layoutY="117.0" prefHeight="47.0" prefWidth="592.0" text="How High can the number you want to guess be?">
         <font>
            <Font name="Arial Black" size="22.0" />
         </font>
      </Label>
      <Button fx:id="backToMenuSettings" layoutX="497.0" layoutY="361.0" mnemonicParsing="false" onAction="#clickedBackToMenuSettings" text="Back to Menu" />
   </children>
</AnchorPane>

Main:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public static Stage pStage;

    public static Parent root1;
    public static Parent root2;
    public static Parent root3;

    public static Scene scene1;
    public static Scene scene2;
    public static Scene scene3;

    public Main() {
    }

    @Override
    public void start(Stage stage) throws Exception {

        pStage = stage;

        root1 = FXMLLoader.load(getClass().getResource("scene1.fxml"));
        root2 = FXMLLoader.load(getClass().getResource("scene2.fxml"));
        root3 = FXMLLoader.load(getClass().getResource("scene3.fxml"));


        scene1 = new Scene(root1);
        scene2 = new Scene(root2);
        scene3 = new Scene(root3);

        stage.setScene(scene1);
        stage.show();

    }

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

Извините, что узлы на немецком языке. Они для меня, чтобы выяснить, почему это происходит, но это должно быть в смене сцен. THX за любую помощь!

1 Ответ

0 голосов
/ 04 февраля 2020

Проблема была в том, что я инициализировал Объект в начале и в каждом контроллере новый. Так что я не справился с тем же, так что значение потеряно.

...