2016-12-18 2 views
0

Java 시계 프로그램을 작업 중이며 두 번째로 시간을 업데이트하는 방법을 잘 모르겠습니다. 나는 thread.sleep(1000);와 for 루프를 사용하여 시도했지만 그 작동하지 않았다. 또한 누군가가 흰색으로 열어두기 전에 작은 지연을 가지고 검은 색으로 변하는 것을 막을 수 있다면 정말 감사 할 것입니다. 당신은 설정 TimerTask를해야하고 별도의 THEAD에서 실행JavaFX의 장면에서 시간을 미세하게 업데이트해야합니다.

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
import javafx.scene.paint.Color; 
import javafx.scene.layout.HBox; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import java.text.DateFormat; 
import java.util.Date; 
import java.text.SimpleDateFormat; 

    public class Clock extends Application { 

     @Override public void start(Stage stage) { 

      DateFormat df = new SimpleDateFormat("EEE,MMM d yyyy - h:mm:ss a"); 
      Date date = new Date(); 
      String stringDate = df.format(date); 

      Text text = new Text(10, 60, stringDate); 
      text.setFont(Font.font ("Digital Dream Fat", 30f)); 
      text.setFill(Color.RED); 

      HBox hbox = new HBox(); 

      Scene scene = new Scene(new Group(text)); 
      scene.setFill(Color.BLACK); 

      stage.setScene(scene); 
      stage.initStyle(StageStyle.UNDECORATED); 
      stage.setWidth(710); 
      stage.setHeight(80); 
      stage.show(); 
     } 

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

답변

0

첫째, 당신은 백그라운드 스레드에서 UI의 구성 요소는 스레드로부터 안전하지 않은 것으로, 따라서 UI의 모든 업데이트 작업은 UI의 스레드 자체 내에서 수행해야 기억해야하지 그렇지 않으면 UI의 스레드를 차단합니다.

업데이트하려면 스레드 안전 메커니즘을 사용하십시오. 그 중 하나는 Timeline 클래스입니다. 이제 코드에 구현해 보겠습니다. new KeyFrame(Duration.seconds(1)))그래서 매 순간이 그냥 타임 라인의 인스턴스를 가지고 중지, Duration.minutes(1) 될 것입니다 슬립/일시 정지 부분이 줄에 제어

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
import javafx.scene.paint.Color; 
import javafx.scene.layout.HBox; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import java.text.DateFormat; 
import java.util.Date; 
import java.text.SimpleDateFormat; 
import javafx.animation.Animation; 
import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.util.Duration; 

    public class Clock extends Application { 

     @Override public void start(Stage stage) { 

      DateFormat df = new SimpleDateFormat("EEE,MMM d yyyy - h:mm:ss a"); 
      Date date = new Date(); 
      String stringDate = df.format(date); 

      Text text = new Text(10, 60, stringDate); 
      text.setFont(Font.font ("Digital Dream Fat", 30f)); 
      text.setFill(Color.RED); 

      HBox hbox = new HBox(); 


      Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0), 
     new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent actionEvent) { 
       Date update = new Date(); 
      String stringNewDate = df.format(update); 
        text.setText(stringNewDate); 
      } 
     } 

     ), new KeyFrame(Duration.seconds(1))); 
       timeline.setCycleCount(Animation.INDEFINITE); 
     timeline.play(); // timeline.stop() 

      Scene scene = new Scene(new Group(text)); 
      scene.setFill(Color.BLACK); 

      stage.setScene(scene); 
      stage.initStyle(StageStyle.UNDECORATED); 
      stage.setWidth(710); 
      stage.setHeight(80); 
      stage.show(); 
     } 

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

는 .. 다음 너무 많은 timeline.stop()

+0

감사 해. 이것은 매우 도움이되었습니다 – Herseept72

+0

당신은 그것을 즐겁게 즐겨요 : P –

관련 문제