2015-11-10 2 views
0

ниже код был использован для создания секундомера переменной смин и SSEC устанавливаются при нажатии кнопки и метод вызывается из AnimationTimerJavaFX LocalTime построить Секундомер

Я хотел бы знать, если есть более простой способ, чтобы написать эту процедуру, как это, кажется, как спагетти код

private void elapsedTIME(){ 

    eSEC = LocalTime.now().getSecond(); 

    if(eSEC > sSEC){ 
     showSEC = eSEC - sSEC; 
    } 
    if(eSEC <= sSEC){ 
     showSEC = eSEC + (60-sSEC);  
    } 

    if(showSEC == 60 && elapsedTimeTest == true){ 
     elapsedTimeTest = false; 
    } 
    if(showSEC == 60 && elapsedTimeTest == false){ 
     eMIN = LocalTime.now().getMinute(); 
     if(eMIN > sMIN){ 
      showMIN = eMIN - sMIN; 
     } 
     if(eMIN == 0 && eMIN != sMIN){ 
      showMIN = 60 - sMIN; 
     } 
     if(eMIN < sMIN && eMIN != 0){ 
      showMIN = (60-sMIN) + eMIN; 
     } 
    } 
    msg.setText("Elapsed Time "+showMIN+" Minutes "+(showSEC)+" Seconds"); 
} 
+0

Этот вопрос также хорошо подходит для http://codereview.stackexchange.com, хотя [здесь также прекрасно] (http://meta.codereview.stackexchange.com/questions/5777/a-guide- к-кода-обзор-за стеками-перелива пользователей). – jewelsea

ответ

0

Я предполагаю, что sSEC и sMIN это секунды и минуты на старте.

Вместо того, чтобы хранить их отдельно, просто сохраните LocalTime в начале. Затем вы можете сделать что-то вроде:

LocalTime startTime ; 

// ... 

private void elapsedTIME(){ 

    // Assumes startTime is set somewhere before this is invoked 

    long elapsedSeconds = Duration.between(startTime, LocalTime.now()).getSeconds(); 
    long minutes = elapsedSeconds/60 ; 
    long seconds = elapsedSeconds % 60 ; 
    msg.setText("Elapsed Time "+minutes+" Minutes "+seconds+" Seconds"); 
} 

SSCCE:

import java.time.Duration; 
import java.time.LocalTime; 

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
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 Stopwatch extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Label stopwatch = new Label(); 
     BooleanProperty running = new SimpleBooleanProperty(false); 

     AnimationTimer timer = new AnimationTimer() { 

      private LocalTime startTime ; 

      @Override 
      public void handle(long now) { 
       long elapsedSeconds = Duration.between(startTime, LocalTime.now()).getSeconds(); 
       long minutes = elapsedSeconds/60 ; 
       long seconds = elapsedSeconds % 60 ; 
       stopwatch.setText("Time: "+minutes +" minutes "+seconds + " seconds"); 
      } 
      @Override 
      public void start() { 
       running.set(true); 
       startTime = LocalTime.now(); 
       super.start(); 
      } 
      @Override 
      public void stop() { 
       running.set(false); 
       super.stop(); 
      } 
     }; 

     Button startStop = new Button(); 
     startStop.textProperty().bind(Bindings.when(running).then("Stop").otherwise("Start")); 
     startStop.setOnAction(e -> { 
      if (running.get()) { 
       timer.stop(); 
      } else { 
       timer.start(); 
      } 
     }); 

     VBox root = new VBox(10, stopwatch, startStop); 
     root.setPadding(new Insets(24)); 
     root.setMinWidth(240); 
     root.setAlignment(Pos.CENTER); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

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

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

+0

ваш код изящный, но если вы запустите секундомер, скажем, 59 минут, и когда он пройдет через цикл, где мин 00, тогда переменная min станет -56. Моя мысль заключается в том, что нам все еще нужен тест, когда это происходит, только два условия 0 или> 0, поэтому мой тест на ноль в моем коде для показа мин. Я попробую LocalDateTime, но не уверен, что решит проблему, спасибо за помощь –

+0

, используя первую версию, а не вторую. (Или следить за часами тоже.) –