Есть ли обходной путь для классов, вызывающих друг друга? - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь использовать JavaFX для кодирования секундомера.Но я новичок в Java и все еще не могу понять ООП.Мне нужно, чтобы классы вызывали друг друга методами.Я знаю, что статических методов и переменных следует избегать.В графическом интерфейсе есть кнопки запуска и остановки, которые должны запускать и останавливать таймер.У меня есть "TimerClass" настроено.Внутри есть метод, который запускает код каждую секунду, когда он был активирован один раз.Поэтому, когда я нажимаю кнопку запуска, я хочу, чтобы это произошло.Кажется, это уже работает.Но каждую секунду переменная "secondsPassed" обновляется, ярлык на моем графическом интерфейсе также должен обновляться.

Я мог бы сделать lblTime Button и соответствующий метод статическими.Также я слышал о настройке конструкторов таким образом, чтобы вы могли сделать каждый экземпляр равным другому существующему экземпляру.Но я все еще не понимаю этого достаточно, чтобы иметь возможность использовать его.( Java: классы с экземплярами друг друга ) Я также попытался создать "helper class".Это было сделано для того, чтобы не создавать экземпляры двух классов друг от друга.Но вспомогательный класс был бы еще одним экземпляром "TimerClass".У меня есть код, чтобы показать, что я пробовал до сих пор.

package application;

import application.TimerClass;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class Controller {
    TimerClass timerClass = new TimerClass();

    @FXML
    Button btnStart;
    @FXML
    Button btnPause;
    @FXML
    Label lblTime;

    public void btnStartAction() {
        timerClass.timerStart();
    }

    public void btnPauseAction() {
        timerClass.timerPause();
    }

    public void setLblTime(int input) {
        lblTime.setText(""+input);
    }

}
package application;

import application.Controller;
import application.Helper;

import java.util.Timer;
import java.util.TimerTask;

public class TimerClass {
    static int secondsPassed = 0;

    Controller controller = new Controller();
    TimerClass timerClass = new TimerClass();
    Helper helper;

    public TimerClass(TimerClass input){
        this.helper = timerClass;
    }

    public TimerClass() {

    }

    Timer mytimer = new Timer();
    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            secondsPassed++;
            System.out.println("" + secondsPassed);
        }
    };

    public void timerStart() {
        mytimer.scheduleAtFixedRate(timerTask, 1000, 1000);
    }

    public void timerPause() {
        mytimer.cancel();
    }

    public int getSecondsPassed() {
        return secondsPassed;
    }

}

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 10 июня 2019

Вам не нужно копировать классы друг из друга. На самом деле это было бы плохой идеей, поскольку экземпляр класса Controller отличается от класса, используемого в вашей сцене.

Вместо этого вы должны передать существующий класс вашему TimerClass. (Обратите внимание, что вы можете «спрятать» Controller за интерфейсом, чтобы сделать TimerClass более пригодным для повторного использования.)

public class TimerClass {
    // don't make this static
    // otherwise you won't be able to use multiple instances at the same time
    volatile int secondsPassed = 0; 

    private final Controller controller;


    public TimerClass(Controller controller) {
        this.controller = controller;
    }

    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            secondsPassed++;
            // update on the JavaFX application thread
            Platform.runLater(() -> controller.setLblTime(secondsPassed));
        }
    };

    public void timerStart() {
        mytimer.scheduleAtFixedRate(timerTask, 1000, 1000);
    }

    public void timerPause() {
        mytimer.cancel();
    }

    public int getSecondsPassed() {
        return secondsPassed;
    }

}
public class Controller {
    TimerClass timerClass = new TimerClass(this);
    ...
}

Возможно, вы захотите взглянуть на первое предложение в следующем ответе: https://stackoverflow.com/a/9966213/2991525

0 голосов
/ 10 июня 2019

Привет, Леонард, отличная работа, кажется, у вас пока есть приличное понимание вещей.Дайте мне знать, если я правильно понимаю проблему, поэтому у вас есть кнопка, которую вы нажимаете под названием «Пуск».Эта кнопка заставляет тикать секунды, и, кроме того, у вас есть метка, которая отображает текущие секунды, но метка не обновляется, чтобы показать текущие секунды?

Первое, что приходит на умmind устанавливает логическое значение для кнопки start.

if (** when the user clicks the button **) {
      buttonBoolean = !buttonBoolean; //this just turns false to true; and true to false.
}

Затем в методе, который добавляет секунды, сделайте оператор 'if', чтобы проверить, включена ли кнопка запуска.

if (buttonBoolean == true) {
    seconds++;
    setLabelValue = seconds;
}

Если это правда, обновите секунды и установите значение метки на обновленное значение.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...