2012-01-21 1 views
3

내 스레드 클래스의 자바 코드 다음 한 그래프 시각화를 새로 SWING + 정을 사용하는 동안 :하는 콘텐츠를

@Override  
public void run() { 

    JFrame window = new JFrame("Visualization POC"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    while (true) { 
     window.setVisible(false); 

     Layout<Node,Edge> layout = new CircleLayout<Node, Edge>(graph); 
     layout.setSize(new Dimension(300, 300)); 

     BasicVisualizationServer<Node, Edge> vv = new BasicVisualizationServer<Node, Edge>(layout); 
     vv.setPreferredSize(new Dimension(350, 350)); 
     vv.getRenderContext().setVertexFillPaintTransformer(new NodeColorTransformer()); 
     vv.getRenderContext().setEdgeDrawPaintTransformer(new EdgeColorTransformer()); 

     window.getContentPane().add(vv); 
     window.pack(); 
     window.setVisible(true); 

     try { 
      Thread.sleep(ONE_SECOND); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

내가 그래프 시각화의 상태를 새로 고침을 사용하려면,하지만 난 거대한 문제에 붙어있어 . JFrame의 레이아웃 및 설정 내용을 작성하는 코드 블록이 루프 내에있는 경우 출력 창에 표시되지 않습니다. 내가 전에 그것을 배치 할 때, 그것은 잘 작동하지만 그것이 내가 원하는 것만은 아니다. 내 메인 클래스에서 SpringUtilities.invokeLater를 통해이 스레드를 실행합니다.

잠시 동안 깜박이기 때문에 창이 새로 고침되었음을 알 수 있습니다. 나는 어떤 조언도 기대하고있다.

+1

_Don't_ 잠; _do_ [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. – trashgod

+0

그러나 배경 스레드의 작업 중 하나는 매초마다 데이터를 업데이트하는 것입니다. 그 다음 루프 또는 뭔가 메인 스레드에서 매초마다 실행해야합니까? – tomi891

+0

좋아, 연구 후 루핑 스레드 실행에 대한 답변을 찾았습니다. 두 가지 주요 클래스 : java.util 패키지의 Timer 및 TimerTask – tomi891

답변

0

EDT 스레드에서 코드를 호출합니다. 구성 요소에 대한 모든 업데이트는 EDT 스레드의 끝에 채색됩니다. 스레드가 종료되지 않습니다

코드를 약간 수정했지만 정상적으로 작동합니다. JLabel을 정으로 교체하십시오.

final JFrame window = new JFrame("Visualization POC"); 
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

최종 임의적으로 랜 = 새로운 랜덤();

while (true) { 


    SwingUtilities.invokeLater(new Runnable(){ 
public void run() { 
    window.setVisible(false); 

    JPanel panel = new JPanel(); 
    JLabel label = new JLabel(); 
     int nextInt = ran.nextInt(100); 
    label.setText("Test Label"+String.valueOf(nextInt)); 
    System.out.println(nextInt); 
    panel.add(label); 

    window.getContentPane().removeAll(); 
    window.getContentPane().add(panel); 
    window.pack(); 
    window.setVisible(true); 


} 

});

시도 {

 Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

}

} 동부 서머 타임에