Последнее значение из кубиков JAVAFX

Обычно я не хожу на подобные сайты, но у меня возник серьезный вопрос, и я не могу понять, как это исправить.

Итак, у меня есть простой кубик, который бросается при нажатии кнопки. Он печатает все числа игральных костей в консоли. Теперь я хочу сохранить последний int, чтобы с ним можно было делать вычисления и т. д. Теперь проблема в том, что я серьезно не знаю, как получить последний int кубика и распечатать его в консоли. Есть ли у кого-нибудь в этом опыт и может ли мне помочь? Вот мой код:

btn.setText("Roll Die");
        btn.setOnAction((ActionEvent event) -> {
            btn.setDisable(true);//Disable Button
            Random random = new Random();
            int gekozen = Integer.parseInt(tf3.getText());

            Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(.3), (actionEvent) -> {
                int tempRandom = random.nextInt(6) + 1;
                System.out.println(tempRandom);
                die.setDieFace(tempRandom);

        }));

        timeline.setCycleCount(random.nextInt(20) + 1);
            timeline.play();
            timeline.setOnFinished(actionEvent -> {
                btn.setDisable(false);//Enable Button

            });


});

Разве нельзя просто вызвать die.getDieFace() в обработчике onFinished?

James_D 25.04.2018 22:35

@James_D Нет, потому что это просто возвращает мне изображение

Javaprogrammern00b 25.04.2018 22:39

Не должно. Вы передаете int в setDieFace(...), поэтому вы должны получить обратно int, если вы вызываете getDieFace(), если ваш класс Die определен правильно. Вы всегда можете добавить к нему другой метод, который при необходимости возвращает значение int.

James_D 25.04.2018 22:41

@James_D Возвращает: ImageView @ 1a808c06 [styleClass = image-view]

Javaprogrammern00b 25.04.2018 22:43

Мой код: timeline.setCycleCount (random.nextInt (20) + 1); timeline.play (); timeline.setOnFinished (actionEvent -> {btn.setDisable (false); System.out.println (die.getdieFace ());}); });

Javaprogrammern00b 25.04.2018 22:43

Похоже, вам нужно исправить дизайн любого класса die.

James_D 25.04.2018 22:45

Отредактируйте вопрос, не помещайте код в комментарий. Предоставьте минимальный воспроизводимый пример. В частности, предоставьте код класса Die и любой другой минимальный код, чтобы кто-нибудь мог скопировать и вставить ваш код, чтобы воспроизвести проблему.

jewelsea 25.04.2018 22:45

Почему вы используете другую учетную запись? stackoverflow.com/questions/50021161/…

Sedrick 26.04.2018 05:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Лучший вариант - просто где-то хранить значения. Ваш класс Die (или любой другой класс die) кажется хорошим кандидатом для этого. В хорошо спроектированном классе, если вы передадите значение методу набора, скажем, setXyz(x), то вызов getXyz() без каких-либо операций с тем же объектом в то же время вернет то же значение x. Итак, если вы разработали свой класс в соответствии со стандартными шаблонами Java, вы можете просто сделать

timeline.setCycleCount(random.nextInt(20) + 1);
timeline.play();
timeline.setOnFinished(actionEvent -> {
    btn.setDisable(false);//Enable Button
    int dieValue = die.getDieFace();
    System.out.println(dieValue);
});

Другой вариант - заранее вычислить все временные значения кристалла:

btn.setText("Roll Die");
btn.setOnAction((ActionEvent event) -> {
    btn.setDisable(true);//Disable Button
    Random random = new Random();
    int gekozen = Integer.parseInt(tf3.getText());

    int numTempValues = random.nextInt(20) + 1 ;
    int[] tempValues = random.ints(1, 7).limit(numTempValues).toArray();
    int finalDieValue = tempValues[numTempValues - 1];
    Timeline timeline = new Timeline() ;
    for (int i = 0 ; i < tempValues.length ; i++) {
        KeyFrame keyFrame = new KeyFrame(Duration.seconds(0.3).multiply(i+1), actionEvent -> {
            System.out.println(tempValues[i]);
            die.setDieFace(tempValues[i]);
        });
        timeline.getKeyFrames().add(keyFrame);
    }

    timeline.setOnFinished(actionEvent -> {
        btn.setDisable(false);//Enable Button
        System.out.println("You rolled: "+finalDieValue);
    });

    timeline.play();


});

Вы можете добавить переменную int в класс Die.

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

/**
 *
 * @author blj0011
 */
public class Die
{
    ImageView dieFace;
    Image[] images;
    int dieValue;

    public Die(Image[] images)
    {
        this.images = images;
        dieFace = new ImageView(this.images[0]);//set default to image 0
        dieValue = 1;
    }

    public Die(Image[] images, int dieFaceValue)
    {
        //Need to catch for values less than 1 and greater than 6!
        this.images = images;
        dieFace = new ImageView(this.images[dieFaceValue - 1]);
        dieValue = dieFaceValue;
    }

    public ImageView getdieFace()
    {
        return dieFace;
    }

    public int getDieValue()
    {
        return dieValue;
    }

    public void setDieFace(int dieFaceValue)
    {
        //Need to catch for values less than 1 and greater than 6!
        dieFace.setImage(this.images[dieFaceValue - 1]);
        dieValue = dieFaceValue;
    }
} 

Другие вопросы по теме