코드에서 UI 다시 그리기를 담당하는 JavaFX 응용 프로그램 스레드를 차단합니다. 이 방법으로 GUI의 모든 변경 사항은 표시되지 않으며 이벤트는 처리되지 않습니다.
Task
을 사용하고 메시지를 표시하기 위해 message
속성에 수신기를 추가 할 수 있습니다. 이 속성에 대한 업데이트는 응용 프로그램 스레드에서 실행되도록 보장됩니다. 유일한 단점은 속성에 대한 빠른 업데이트를 위해 일부 알림을 건너 뛸 수 있다는 것입니다. 당신이 표시되는 모든 메시지가 필요하면
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
// update message property
updateMessage("Hello World 1!");
Thread.sleep(500);
updateMessage("Hello World 2!");
Thread.sleep(500);
updateMessage("Hello World 3!");
Thread.sleep(500);
return null;
}
};
// display message changes as notifications
task.messageProperty().addListener((observable, oldMessage, newMessage) ->
Notifications.create().title("Title Text").text(newMessage).darkStyle().show());
// execute long running task on background thread
new Thread(task).start();
, 당신은 알림을 트리거
Platform.runLater
를 사용해야합니다.
Thread thread = new Thread(new Runnable() {
private void postMessage(final String message) {
Platform.runLater(() -> Notifications.create().title("Title Text").text(message).darkStyle().show());
}
@Override
public void run() {
try {
postMessage("Hello World 1!");
Thread.sleep(500);
postMessage("Hello World 2!");
Thread.sleep(500);
postMessage("Hello World 3!");
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(NotificationsTestMain.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
thread.start();
Platform.runLater
을 너무 자주 사용하지 않도록주의하십시오. 많은 업데이트가있는 경우, 때때로 그룹화하는 것이 가장 좋습니다. 그러나이 경우 알림을 사용하지 않으려는 경우가 많습니다. 알림을 모두 표시하기 만하면됩니다. 여기에 업데이트 그룹화를 보여주는 코드가 있습니다.
private final List<String> messageQueue = new ArrayList<>();
private boolean updating;
private final Runnable updater =() -> {
synchronized (messageQueue) {
for (String message : messageQueue) {
Notifications.create().title("Title Text").text(message).darkStyle().show();
}
messageQueue.clear();
updating = false;
}
};
private void postMessage(String message) {
synchronized (messageQueue) {
messageQueue.add(message);
if (!updating) {
updating = true;
Platform.runLater(updater);
}
}
}
타임 라인 사용 platform.runLater와 동일한 문제가 발생합니다. 세 가지 모두는 응용 프로그램 스레드가 수행중인 모든 작업을 마치면 만들어지고 표시됩니다. 내 질문에 Thread.sleep 사용하지만 실제 응용 프로그램을 일부 파일을 다운로드하고 다른 파일 처리를 않습니다. "다운로드 시작 중"을 알리고 "다운로드 완료"등을 알리고 싶습니다.결국 사용자에게 모든 알림을 한 번에 보여주는 것은 분명히 유익하지 않습니다. 저는 타임 라인에 익숙하지 않아서 제가 원하는 방식으로 행동 할 수 있는지보기 위해 조금만 놀아 볼 것입니다. – docb45
@ docb45'타임 라인 (Timeline) '은 나쁜 생각이었습니다 (저는 어떻게 든 "지연을 시뮬레이션하는 스레드. 슬립 (Sleep.Sleep) 지연"부분에주의를 기울이지 않았습니다). 대답을 수정했습니다 ... – fabian
놀라운 작품! 나는 Task와 함께 연주했지만 알림을 표시하기 위해 리스너를 추가하는 것에 대한 부분을 놓치고있었습니다. 이것은 완벽하게 작동합니다. – docb45