2017-09-10 4 views
0

채팅이 MYSQL에 저장되어 있고 응용 프로그램에서 주기적으로 가져 오는 채팅 응용 프로그램을 만들고 있습니다.JavaFX : 사용자 공지없이 VBox를 업데이트하는 방법

데이터베이스에서 채팅을 가져오고, 메시지를 반복하고 하나씩 VBox에 저장합니다. 중복 된 메시지가 표시되지 않도록 VBox를 지우겠습니다. 나는 executor를 사용하는 또 다른 쓰레드를 사용했고 2 초마다 그렇게하도록 스케쥴을 잡았다.

VBox를 지우고 메시지를 저장하는 효과는 VBox가 처음 지워진 후 메시지가 삽입되고 매 2 초마다 계속해서 발생하므로 문제가됩니다.

이 효과가 눈에 띄지 않도록 해결책이 있습니까?

javafx와 같은 스레드에서 작업했는데 메시지가 삭제되고 삽입되는 사이의 지연은 눈에 띄지 않지만 메시지 수가 적을 때만 효과가있었습니다. 따라서 많은 수의 메시지가 있으므로 GUI를 반복하면 GUI가 정지합니다.

+2

코드를 게시하십시오. –

+0

고마워요.하지만 직접 해결했습니다. – zubair130

답변

0

노드 수가 요소 수와 함께 증가하지 않는 GUI 요소를 사용하십시오.

예. ListView/TableView을 사용하거나 표시되는 어린이 만 보여주는 유사한 컨트롤을 작성할 수 있습니다. (행동은 the javadocs for Cell에 설명되어 있음).

ListView<Message> messageList (여기서 Message 단일 메시지의 데이터를 포함하는 클래스, 적절한 Message.toString 구현 또는 필요한 cellFactory) 비 응용 프로그램 스레드에서 다음과 같이 새로 고칠 수 있습니다 :

final Message[] messages = retrieveMessages(); 
Platform.runLater(() -> messageList.getItems().setAll(messages)); 

당신 예를 들어 전송할 데이터의 양을 줄일 수 있습니다. 생성 된 시간을 나타내는 메시지를 포함하는 테이블의 행에 시간 소인을 추가하고 전체 데이터 세트를 바꿀 필요가없는 마지막 데이터를 검색 한 이후에 수정 된 메시지 만 검색하여 추가 할 수있게합니다. 새로운 메시지들, 예.

final Message[] messages = retrieveNewMessages(); 
Platform.runLater(() -> messageList.getItems().addAll(messages)); 
+1

@ smac89 물론 이것은 동기화를위한 몇 가지 고려 사항을 필요로합니다. 고정 된 지연을 가진'ScheduledExecutorService'가 메시지를 검색하면 메시지가 올바른 순서로 추가되었는지 확인할 수 있습니다. – fabian

+0

제안 해 주셔서 감사합니다. 답변의 맨 아래에 작성한 유사한 전략 (예 : 타임 스탬프)으로 이미 문제를 해결했습니다. 어쨌든 시간 내 주셔서 감사합니다. – zubair130

관련 문제