2011-04-22 2 views
2

jung을 사용하여 VisualizationViewer와 연결된 레이아웃의 크기를 변경하는 방법에 대해 궁금합니다.피킹 모드를 사용할 때 Jung으로 레이아웃의 크기를 업데이트하는 방법은 무엇입니까?

목적을 설명합니다. 사실, SatelliteVisualizationViewer를 사용할 때 우리는 노드를 선택하여 SatelliteVisualisationViewer에서 다루지 않는 영역에서 이동할 수 있습니다.

Jung 배포판에있는 SatelliteViewDemo 클래스에서이를 볼 수 있습니다. 데모를 실행하고 노드를 선택하여 레이아웃 크기 밖으로 이동하십시오. 노드는 VisualizationViewer에 잘 표시되지만 위성보기에는 표시되지 않습니다.

그래프의 모든 노드를 포함하는 사각형의 크기로 레이아웃 크기를 업데이트하기 위해 PickingGraphMousePlugin의 MouseListener, 특히 mouseReleased (...) 메서드에 일부 코드를 추가하려고합니다. 이렇게하면 SatelliteView를 업데이트해야합니다. 하지만 어떻게해야합니까?

편집 : 미안하지만 충분히 설명하지 못했습니다. 사실 레이아웃 크기를 변경해도 SatelliteView는 변경되지 않으므로 레이아웃 외부에있는 정점 (선택 및 이동 작업 후)은 여전히 ​​SatelliteView에서 처리 할 수 ​​없습니다. 어쩌면 내가 미스 뭔가를

...

실제로 진짜 질문은 : 어떻게 SatelliteVisualizationViewer에 의해 커버되는 영역을 변경하려면? !!!

답변

0

피킹 지원이 활성화 된 VisualizationViewer에 상대적으로 위성보기를 자동으로 업데이트하려고했습니다.

나는 마침내 또 다른 해결책을 채택했다 : 위성보기의 자동 업데이트가 없지만 마우스 버튼 2를 사용하는 팬과 CTRL + Mouse_Wheel을 사용하는 확대/축소. 여기

는 ... 그것은 도움이 될 수있는 클래스입니다 :

public class SatelliteVisualizationViewerMouseControler implements 
     MouseListener, MouseMotionListener, MouseWheelListener { 

    private SatelliteVisualizationViewer<SVertex, PEdge> vv; 
    private Point drag_point; 
    private double zoom_factor = 0.1; 

    public SatelliteVisualizationViewerMouseControler(
      SatelliteVisualizationViewer<SVertex, PEdge> vv) { 
     this.vv = vv; 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     if (drag_point != null) { 
      Point2D l_drag_point = vv.getRenderContext() 
       .getMultiLayerTransformer() 
       .inverseTransform(Layer.LAYOUT, drag_point); 

     Point2D l_e_point = vv.getRenderContext() 
       .getMultiLayerTransformer() 
       .inverseTransform(Layer.LAYOUT, e.getPoint()); 

     double delta_x = l_e_point.getX() - l_drag_point.getX(); 
     double delta_y = l_e_point.getY() - l_drag_point.getY(); 

     double scale = vv.getRenderContext().getMultiLayerTransformer() 
       .getTransformer(Layer.VIEW).getScale(); 

     vv.getRenderContext().getMultiLayerTransformer() 
       .getTransformer(Layer.LAYOUT) 
       .translate(delta_x * (1/scale), delta_y * (1/scale)); 

     drag_point = e.getPoint(); 
     } 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON2) { 
      drag_point = e.getPoint(); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON2) { 
      drag_point = null; 
     } 
    } 

    @Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     if (e.getModifiersEx() == MouseEvent.CTRL_DOWN_MASK) { 
      vv.getRenderContext() 
        .getMultiLayerTransformer() 
        .getTransformer(Layer.LAYOUT) 
        .scale(1 + (e.getWheelRotation() * zoom_factor), 
          1 + (e.getWheelRotation() * zoom_factor), 
          vv.getCenter()); 
     } 
    } 
} 
0

계속 진행하는 방법에 대한 좋은 아이디어가있는 것 같습니다. 너 무슨 조각 붙어있어? 레이아웃 크기 변경? 시각화를 업데이트 하시겠습니까? 다른 것?

+0

죄송 충분히 자세한 조하지 않은 수 있습니다. 실제로 레이아웃 크기를 변경해도 SatelliteView는 변경되지 않으므로 레이아웃 외부에있는 정점 (선택 및 이동 작업 후)은 여전히 ​​SatelliteView에서 처리 할 수 ​​없습니다. 어쩌면 내가 뭔가를 놓친 것 같습니다 ... 실제로 진짜 질문은 : SatelliteVisualizationViewer에서 다루는 영역을 어떻게 변경합니까? !!! – njames

+0

레이아웃 크기뿐만 아니라 VV 치수 (setSize() 사용)를 변경해야합니다. 레이아웃과 시각화 좌표 공간이 다르기 때문에 다른 것으로 생각하는 것이 도움이 될 수 있습니다. 그렇게했으면 시각화를 새로 고침해야합니다. –

+0

그 점에 대해서는 조사한 바 있지만 해결책이 더 가깝지는 않습니다. 실제로 위성 시각화 뷰어에서 다루는 영역 바깥에 정점을 배치 할 수 있습니다. 버텍스를 선택하여 "노드"로 옮기고 레이아웃이나 위성 시각화 뷰어 크기를 확장해도 정점이 표시되지는 않는다고 생각하십시오. 또 다른 한가지 : SatelliteVisualizationViewer를 새로 고치는 것만으로는 충분하지 않습니다. 우리는 fireStateChange()를 사용해야합니다. – njames