2017-02-22 24 views
1

Я создаю в настоящее время приложение с использованием JavaFx с дополнительной функцией, которая отображает текущую дату и время в верхнем углу сцены. Поскольку я новичок в JavaFX, я не знаю, как реализовать это.JavaFX Live Время и дата

Я попытался использовать старый код в swing, но получил ошибку IllegalStateException.

Вот мой код.

MainMenuController.java

@FXML private Label time; 

private int minute; 
private int hour; 
private int second; 

@FXML 
public void initialize() { 

    Thread clock = new Thread() { 
     public void run() { 
      for (;;) { 
       DateFormat dateFormat = new SimpleDateFormat("hh:mm a"); 
       Calendar cal = Calendar.getInstance(); 

       second = cal.get(Calendar.SECOND); 
       minute = cal.get(Calendar.MINUTE); 
       hour = cal.get(Calendar.HOUR); 
       //System.out.println(hour + ":" + (minute) + ":" + second); 
       time.setText(hour + ":" + (minute) + ":" + second); 

       try { 
        sleep(1000); 
       } catch (InterruptedException ex) { 
        //... 
       } 
      } 
     } 
    }; 
    clock.start(); 
} 

MainMenu.fxml

<children> 
    <Label fx:id="time" textFill="WHITE"> 
    <font> 
     <Font name="Segoe UI Black" size="27.0" /> 
    </font> 
    </Label> 
    <Label fx:id="date" textFill="WHITE"> 
    <font> 
     <Font name="Segoe UI Semibold" size="19.0" /> 
    </font> 
    </Label> 
</children> 

Main.java

public class Main extends Application { 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("view/MainMenu.fxml")); 
     primaryStage.setScene(new Scene(root,1366, 768)); 
     primaryStage.show(); 
    } 
} 

Как вам нет tice, я протестировал его, распечатав живое время в консоли. Да, это сработало, но ярлык все еще статичен.

+0

Side Примечание: если вы используете Java SE 8 (или больше) рекомендуется, когда это возможно, использовать новый API Date & Time. – Puce

+0

Возможный дубликат: [* JavaFX Отображение времени и обновление в каждую секунду *] (https://stackoverflow.com/q/38566638/642706) –

ответ

5

Я думаю, что вам нужно FX UI тему Platform.runLater(...) для этого, но вы можете сделать что-то подобное, используя TimeLine в вас классе контроллера,

@FXML 
public void initialize() { 

    Timeline clock = new Timeline(new KeyFrame(Duration.ZERO, e -> {    
     Calendar cal = Calendar.getInstance(); 
     second = cal.get(Calendar.SECOND); 
     minute = cal.get(Calendar.MINUTE); 
     hour = cal.get(Calendar.HOUR); 
     //System.out.println(hour + ":" + (minute) + ":" + second); 
     time.setText(hour + ":" + (minute) + ":" + second); 
    }), 
     new KeyFrame(Duration.seconds(1)) 
    ); 
    clock.setCycleCount(Animation.INDEFINITE); 
    clock.play(); 
} 
+0

Получил это. Благодаря! –

+0

Да, удачи! –

+1

Обратите внимание, что временная шкала, обновляющая каждую секунду, может быть чем-то за секунду позади реального времени. Использование «AnimationTimer» будет таким же точным, как позволяет рендеринг пользовательского интерфейса. Вероятно, более чистое использование «LocalTime» и «DateTimeFormatter» вместо старого класса «Календарь». –

 Смежные вопросы

  • Нет связанных вопросов^_^