2017-10-16 8 views
-3

URL이 포함 된 ListView가 있습니다. 사용자가 URL 중 하나를 클릭하면 비디오가 다운로드됩니다. 스레드에서 차례로 호출되는 Task 내에서 비디오 다운로드 기능을 호출합니다. 사용자가 여러 개의 비디오 URL을 클릭하면 비디오가 다운로드되기 시작합니다. 각 비디오에 대해 별도의 작업이 생성됩니다. 내가 알고 싶은 것은 각 비디오에 대해 Task를 고유하게 식별하는 방법입니다. 작업을 포함javafx에서 각 태스크를 고유하게 식별하는 방법은 무엇입니까?

public void videoFileDownload(){ 
      try { 

       videoDownloadUrl = lblURL.getText().toString(); 

       IndexOfThisNode = hbox.getId(); 


       String path = "XXXX"; 
       downloadThisVideo = new VGet(new URL(videoDownloadUrl),new File(path));    




       downloadThisVideo.download(); 
       System.out.println("Download this video: " + videoDownloadUrl + downloadThisVideo.getVideo().getState()); 

       System.out.println("Download complete"); 



      } catch (Exception ex) { 
       ex.printStackTrace(); 
       System.out.println("Retrying..."); 
      } 
     } 

기능 :

public void showDetailsButton(){ 

     btnSMDetails.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{ 
     System.out.println("\n" + "The index is: " + getIndex() + "\n"); 
     showLoader(); 


     //Task created to download videos in background without blocking UI 
     Task downloadVideoTask = new Task<Void>() { 
      @Override 
      public Void call() { 
       //SIMULATE A FILE DOWNLOAD 
       videoFileDownload(); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }; 

     new Thread(downloadVideoTask).start(); 

     downloadVideoTask.setOnSucceeded(taskFinishEvent ->{showLoader(); /*isButtonClicked="0";*/}); 
    }); 
} 
+1

질문이 너무 광범위하게 보인다 - 작업을 식별한다는 것은 무엇을 의미합니까? 아마도 각 '작업'에는 다운로드 한 비디오의 URL이 있어야합니다. 그만하면 충분할 수 있습니다. 또 다른 방법은 생성시 ID를 할당하거나 단순히 참조 동등성을 사용하는 것입니다. 무엇을 성취하려고합니까? – Itai

+0

@sillyfly 비디오를 다운로드하는 동안 listcell이 비활성화되고 진행률 표시 줄이 표시됩니다. 그러나 모든 방법을 아래로 스크롤 한 다음 다시 해당 셀로, 더 이상 사용할 수 없으며 진행률 표시 줄이 표시되지 않습니다. 그래서, 나는 listcell에게 다운로드 버튼이 눌러 진 셀을 업데이트하지 말하라고하고 싶다. 친구가이 작업을 사용하여 작업을 저장하고 작업을 저장할 수 있다고 말했습니다. –

+2

해결하려는 실제 문제를 나타내는 [MCVE]를 만듭니다. –

답변

1

Listcells는 기본 목록과 하나의 관계에 대한 하나에 존재하지 않는

기능은 비디오를 다운로드합니다. listview의 뷰포트를 채우기 위해 인스턴스화 된 충분한 수의 listcell 만 있습니다. 데이터는 updateCell 메소드를 통해 목록 셀의 안팎으로 스왑됩니다.

목록을 스크롤해도 셀이 다른 목록 항목에 다시 사용되므로 목록 셀에 데이터를 저장할 수 없습니다.

당신이해야 할 일은 기본 목록 항목에 작업에 대한 참조를 저장하는 것입니다. updateCell 메서드를 수정하여 listcell의 진행률 막대의 가시성과 값을 작업 진행률 속성에 바인딩합니다.