2013-08-23 3 views
1

끊임없이 업데이트되는 정 그래프 (새 정점, 정점 제거 및 기존 정점 업데이트)가 있습니다. 이 모든 작업은 자신의 스레드에서 실행되는 커스텀 클래스에서 이루어지며, 외부 소스로부터의 업데이트를 기다린 다음 적절하게 업데이트합니다.EDT에서 JUNG 그래프의 업데이트를 수행해야합니까?

이제 그래프를 시각화하려고하므로 그래프에 대한 참조를 검색하고 VisualizationViewer에 지정된 레이아웃으로 설정합니다. 업데이트가 들어 오면 다른 스레드에서 처리 된 다음 VisualizationViewer.repaint()를 호출하여 그래프를 새로 고칩니다.

제 질문은, EDT의 그래프 개체를 업데이트하는 모든 작업을해야합니까? 또는 별도의 스레드에서 작업을 수행 한 다음, 지금하고있는 것처럼 vv.repaint()를 호출해도됩니다. 유용하거나 관련이 있는지 확신 할 수 없지만 대부분의 업데이트가 외부 소스에서 오는 동안 사용자는 GUI를 통해 여전히 수동으로 그래프의 내용을 삭제할 수 있습니다.

감사

답변

0

조나단의 대답처럼되는 곳 VisualizationViewerrepaint 방법에 확인 전화를 걸입니다 잘못 EDT의 그래프 개체를 업데이트 할 필요가 없습니다.

VisualizationViewer은 항상 EDT에 있어야하지만, addVertex 또는 addEdge과 같은 기능은 모든 스레드에서 호출 할 수 있습니다. 기억해야 할 중요한 점은 업데이트중인 동일한 스레드에서 vv.repaint()으로 호출 할 수 없다는 것입니다.

나는 을 가지고 JPanelPropertyChangeListener을 추가하여이를 달성합니다. 그러면 그래프의 변경 내용을 수신하고 이에 따라 다시 그리기를 호출합니다.

+0

GUI를 업데이트해야한다고 말하고있는 것입니다 당신의 대답에서, 당신은 EDT에서'repaint', GUI 업데이트를 유지하고 그 차선책입니다 ... 예를 들어 EDT의 레이블을 변경하거나 EDT에 정점을 추가하는 것만 제외하면 EDT에서 할 수 있습니다 . –

+0

이것은 내가 찾고있는 것입니다. 감사! – Smitty

+0

이제 Jon의 의견에 약간 혼란스러워합니다. – Smitty

0

대부분의 GUI 업데이트는 EDT에서 수행해야합니다. 직접 변경하지 않고 repaint으로 전화하는 것을 피하는 것이 좋습니다.

final JLabel label = yourLabel; 
Runnable code = new Runnable() { 

    @Override 
    public void run() { 
    label.setText("SomeText");  
    } 
}; 

if (SwingUtilities.isEventDispatchThread()) { 
    code.run(); 
} else { 
    SwingUtilities.invokeLater(code); 
} 

그런 식으로, 당신은 코드가있는 스레드에서 걱정할 필요가 없습니다 :

는 코드의 좀 그렇게 할 수 GUI를 업데이트 할 수있는 코드가 EDT에서 호출되어 있는지 확인하려면 에서 호출하고 레이블을 업데이트합니다.

편집 : 가 명확히하기 위해 당신이 당신의 그래프를 업데이트 할 때, 당신은 무엇을 할 수 있는지가,이

final VisualizationViewer viewer = w; 
Runnable code = new Runnable() { 

    @Override 
    public void run() { 
    viewer.repaint();  
    } 
}; 

if (SwingUtilities.isEventDispatchThread()) { 
    code.run(); 
} else { 
    SwingUtilities.invokeLater(code); 
} 
+0

GUI를 만들 때 그래도 그래프에 대한 참조를 반환해도 괜찮지 만, 그 시점 이후에 그래프를 업데이트 할 때 invokeLater를 사용하여 EDT에서 수행해야합니까? – Smitty

+0

네, EDT에서 그렇게 오래 될 것입니다. 필요한 변경 사항 이상으로'repaint'를 사용하지 않는 것이 좋습니다. –

+0

나는 네가 지금 말한 것을 얻은 것 같아. EDT의 내용을 업데이트 한 후 실행 파일을 종료 할 때 필요한 것을 새로 고칩니다. 그래서 EDT에서 일을 변경하면'repaint'를 호출하는 것이 여분의 많은 것들을 필요로하지 않기 때문에 더 낫습니다. – Smitty