티스토리 뷰
들어가며
- JavaFX를 이용해 실시간으로 업데이트되는 Timer 컨트롤을 구현해보고자 합니다.
- 원본 소스는 아래 위치에 있습니다.
구현
Timer.fxml
<fx:root type="StackPane" prefHeight="400.0" prefWidth="260.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Rectangle height="50.0"
style="-fx-fill: #2d4035; -fx-stroke: transparent; -fx-arc-height: 7; -fx-arc-width: 7; -fx-stroke-type: inside; -fx-stroke-width: 0;"
width="400.0"/>
<Text fx:id="time"
style="-fx-fill: #FFF5E2; -fx-font-weight: bold; -fx-font-size: 30px; -fx-stroke-type: outside; -fx-stroke-width: 0;"
text="0000-00-00 00:00:00">
<StackPane.margin>
<Insets left="20.0" right="20.0"/>
</StackPane.margin>
</Text>
</children>
</fx:root>
-
따로 CSS는 없어서 디자인 좀 구립니다..
-
시각이 표현될 TextView를 Rectangle을 이용하여 만들어 줍니다.
- fx:root가 궁금하다면 아래 글 참고
- fx:root가 궁금하다면 아래 글 참고
TimerViewModel.java
public class TimerViewModel {
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private final StringProperty time = new SimpleStringProperty();
private ScheduledFuture<?> scheduledFuture;
public TimerViewModel() { startRealTimeMode(); }
public void startRealTimeMode() {
stopTimer();
scheduledFuture = Executors.newSingleThreadScheduledExecutor()
.scheduleWithFixedDelay(() -> Platform.runLater(() -> setTime(ZonedDateTime.now(ZoneId.of("Asia/Seoul")))),
0,
500,
TimeUnit.MILLISECONDS);
}
private void setTime(ZonedDateTime targetTime) { time.set(targetTime.format(TIME_FORMAT)); }
private void stopTimer() {
if (scheduledFuture != null && !scheduledFuture.isDone()) {
scheduledFuture.cancel(true);
scheduledFuture = null;
}
}
public StringProperty timeProperty() { return time; }
}
-
실시간으로 변경되는 시각 데이터를 가지고 있는 ViewModel 클래스입니다.
-
내부에서 Timer를 통하여 1초마다 시각을 업데이트 해줍니다.
-
시각 정보는
StringProperty
로 제공이 되며 후에 Text를 표현할 컨트롤에 bind되어 활용될 예정입니다.
TimerController.java
public class TimerController extends StackPane {
@FXML
private Text time;
TimerViewModel viewModel;
public TimerController() {
viewModel = new TimerViewModel();
FxUtil.loadFxml(this);
init();
}
private void init() {
time.textProperty().bind(viewModel.timeProperty());
}
}
-
Timer를 전시할 Controller 클래스 입니다.
- FxUtil.loadFxml(this)는 FXML 파일을 로딩하는 코드를 Util 클래스로 분리한 것으로 이 곳을 참고
-
내부에서
TimerViewModel
인스턴스를 생성하여 viewmodel의timeProperty()
를 TextView 역할을 하는time
에 바인딩 시켜줍니다.
실행
TimerTest.java
public class TimerTest extends Application {
@Test
public void test() {
launch();
}
@Override
public void start(Stage primaryStage) throws IOException {
TimerController controller = new TimerController();
primaryStage.setScene(new Scene(controller));
primaryStage.setTitle("Timer Test");
primaryStage.show();
}
}
- 테스트 코드를 만들어 전시해주도록 합시다.
결과 화면
- 기능은 잘 동작하는군요. (디자인은 신경쓰지 않겠습니다)
관련 글
끝으로
이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > JavaFX' 카테고리의 다른 글
(JavaFX) JavaFX TableView 사용법 ver.2 (2) | 2020.03.18 |
---|---|
[JavaFX] JavaFX UI Test Code 작성 방법 (0) | 2020.03.14 |
(JavaFX) FXML 작성 시 "<fx:root>" 를 사용하는 이유 (0) | 2020.02.27 |
(JavaFX) JavaFX 애니메이션 사용법 (0) | 2020.02.01 |
[JavaFx] Tray Icon에 메뉴 추가 방법 (Tray Menu 사용법) (1) | 2019.11.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 자전거
- 일본 자전거 여행
- 인텔리제이
- 텐트
- effectivejava
- 자전거 여행
- 스프링부트
- JavaFX Table View
- 방통대 과제물
- 일본여행
- effective java
- Java UI
- 이펙티브
- TableView
- JavaFX 테이블뷰
- 배낭 여행
- springboot
- JavaFX 종료
- 일본 여행
- git
- windows
- 자바
- 이펙티브 자바
- 이펙티브자바
- JavaFX Window Close
- 배낭여행
- java
- 일본 배낭여행
- JavaFX
- intelij
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함