2017-02-10 2 views
0

javafx UI 스레드에서 일부 무거운 작업을 수행하는 동안 진행률 표시기가 (회전하지 않고 멈추지 않음) 표시 할 수 있습니까?GUI 스레드에서 많은 작업을하는 동안 ProgressIndicator를 실행해야합니다.

Backstory : 필자는 다소 큰 tableView를 TitledPane (몇 초 소요)에로드해야합니다. 모든 것을 지연시키는 명령은 TitledPane.setContent (myTableView)입니다. 그래서 적어도이 시간 동안 로딩 애니메이션이나 표시기를 보여주고 싶습니다.

그래서 지금 UI 스레드에게 비싼 호출하기 전에 내 로딩 애니메이션을 보여줄 호흡에 충분한 공간을 제공하기 위해, 다음을 수행 메신저 :

showMyLoadingAnimation(); 
PauseTransition pause = new PauseTransition(Duration.seconds(1)); 
pause.setOnFinished(event -> { 
    setContent(myTableView); 
}); 
pause.play(); 
dismissMyLoadingAnimation(); 

이 표시된 진행 표시기를 얻을 작동을하지만, 한 번 UI 스레드가 setContent에서 작동하기 시작합니다.

일부 사람들은 스윙을 사용하여 스누핑을 사용하여 애니메이션이나 대화 상자를 표시하여 다른 스레드에서 실행되고 멈추지는 않지만 보이지 않는 해결책을 찾지 못했습니다.

편집 : 좋아, 그 문제의 뿌리를 발견. 그래서 테이블에 prefHeightProperty가 표시되어있는 목록의 크기에 바인딩 된 표를 가져 왔습니다. JavaFX - Adapt TableView height to number of rows 그 일주일 전 일하고 잊었습니다.

많은 시간이 걸립니다. 그래서 바인딩을 설정할 때 호출 시간을 측정하는 데 시간이 많이 걸리는 것으로 나타 났지만, ui 스레드는 테이블이 커질 때 큰 문제가있는 것처럼 보입니다.

제임스 덕분에 그의 답변은 이런 종류의 문제에 부딪 치는 대부분의 사람들에게 올바른 답변이 될 것입니다.

사람은 거기에이 문제를 언급하시기 바랍니다 수 있습니다 JavaFX - Adapt TableView height to number of rows 을 백그라운드 스레드에서 실행하는 Task

+0

'titledPane.setContent (myTableView) :

기본 개념은 같다. 코드에서 다른 일이 일어나고 있습니다. 아마 데이터를로드 중입니다. 시간 소모적 인 작업 (실제 UI 작업이 아닌)을 백그라운드 스레드로 옮겨야합니다. –

답변

1

로드 데이터 (이것은 첫 번째 질문이기 때문에 내가 아직 언급을 충분히 담당자를 필요 없다.). 작업을 시작할 때로드 애니메이션 (또는 ProgressIndicator 등)을 표시하고 작업이 완료되면이를 제거하십시오. `현실적으로 어떤 일정한 시간이 될 수 없다

TableView<MyDataType> table = new TableView<>(); 
// set up columns... 

Task<List<MyDataType>> loadDataTask = new Task<List<MyDataType>>() { 
    @Override 
    protected List<MyDataType> call() throws Exception { 
     List<MyDataType> data = ... ; 
     // load data and populate list ... 
     return data ; 
    } 
}; 
loadDataTask.setOnSucceeded(e -> table.getItems().setAll(loadDataTask.getValue())); 
loadDataTask.setOnFailed(e -> { /* handle errors... */ }); 

ProgressIndicator progressIndicator = new ProgressIndicator(); 
table.setPlaceHolder(progressIndicator); 

Thread loadDataThread = new Thread(loadDataTask); 
loadDataThread.start(); 
+0

안녕하세요! 이미 도착했습니다. 하지만 당신의 코드로 다시 시도했지만 아무 소용이 없습니다. 데이터를 준비하는 것이 큰 문제는 아니지만, 이미 거기에있는 table.getItems(). set ...은 전체적으로 길다는 것을 알게되었습니다. 더 깊게 파고 난 후에 나는이 혼잡의 범인을 발견했습니다. 필자는 이것으로 내용에 맞게 테이블 높이를 조정했습니다. http://stackoverflow.com/questions/27945817/javafx-adapt-tableview-height-to-number- 행의 을 사용하여 테이블의 prefHeightProperty를 목록 크기에 바인딩합니다. 호출 자체가 그 (시간을 재어 시도),하지만 난 그 갑자기 빠른 주석 경우 오래 걸리지 않습니다. – 84n4n4

+0

@ 84n4n4'table.getItems(). setAll (...)'이 얼마나 걸리는지에 대한 의견을 이해할 수 없습니다. 배경 스레드에서'getItems(). setAll (...)'을 실행하지 않고 백그라운드 스레드가 완료된 후 FX 응용 프로그램 스레드에서 실행하고 있습니다.그리고 분명히, 테이블의 높이를 아이템 목록의 크기에 바인딩하더라도 (사용하기에 충분히 견고하다고는 생각하지 않습니다), 목록을 한 번만 변경하면 (setAll (. ..)') 한 번에 각 요소를 추가하는 것이 아니라 문제가되지 않습니다. 실제 문제가 무엇인지 먼저 파악해야하는 것 같습니다. –

+0

혼란스럽게 생각합니다. 데이터 준비는 타이밍상의 문제가 아닙니다. 테이블에 데이터를 설정하는 것은 타이밍 문제가 아닙니다. 내 창에 빈 테이블이나 작은 테이블을 타이밍 문제가 아닌 것으로 설정합니다. 그러나 많은 양의 데이터가있을 때는 모든 것이 깨집니다. >> 한 번에 각 요소를 추가하는 것과 달리 목록을 한 번만 변경하면 (setAll (...) 사용) 문제가되지 않습니다. 이것은 정확하게 무엇을하고 있으며, prefHeight의 바인딩은 느리지 만 빠르지 않습니다. 나는 작은 exampe를 해킹하고 복제하고 여기에 게시하려고합니다. – 84n4n4

관련 문제