2011-02-09 4 views
0

나는 사용자가 호출하고 볼 수있는 이미지를 나타내는 노드가있는 Jtree가 있습니다. 때로는 이미지를로드하는 데 최대 4 ~ 5 초가 소요됩니다. 이상적으로는 사용자가 대기하고 트리에서 선택된 노드를 선택하는 동안 대기 커서를 표시하고 싶습니다. 그러나 사용자가 노드를 클릭하면 아무 것도 나타나지 않고 이미지가 나타나고 노드가 선택됩니다 (대기 커서가 나타나지 않거나 매우 짧게 표시된 다음 즉시 사라집니다. 내가 원하는 순서대로 동작을 수행하도록 트리와 애플릿을 모두 다시 칠해 보았습니다. 지금까지는 행운이 없었습니다. 어떤 제안이 있습니까? 다음은 저에게 제공하는 일부 스윙 코드의 섹션입니다 문제 :스윙 업데이트 퍼즐

thisApplet.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
selectdocumentTreeLeaf(); // a JTree with nodes representing images     
tree.repaint(); 
thisApplet.repaint(); 
tree.setEnabled(false); //disabled so users don't keep clicking on it. 
result = createImage(queue.q[pointer].currentPage); //where the image is fetched    
thisApplet.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 

+1

이미지를로드하는 동안 주 스윙 스레드를 차단할 가능성이 있습니까? 구성 요소의 paint 메소드에 이미지로드 코드가 있습니까? – Pace

답변

4

나는 페이스 돈에 생각 EDT 및 스레드 페이지에 대한 자세한 내용은 Concurrency in Swing를 확인하시기 바랍니다 이러한 SwingWorker를하고 해결할 수 문제로 백그라운드 스레드를 사용합니다.. 흠집. 예 :

thisApplet.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
    selectdocumentTreeLeaf(); 
    tree.repaint(); 
    thisApplet.repaint(); 
    tree.setEnabled(false); 

    new SwingWorker<Image, Void>(){ 
    @Override 
    protected Image doInBackground() throws Exception { 
     return createImage(queue.q[pointer].currentPage);; 
    } 

    @Override 
    protected void done() { 
     try { 
      result = get(); 
      thisApplet.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
      tree.setEnabled(true); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
    } 
    }.execute(); 
+0

다시 한번 나는 아직도 많은 자바를 배우는 것에 놀라움을 금치 못했다. 이것은 저에게 새로운 지평을 열었습니다. 고맙습니다. – Elliott