2011-04-22 51 views
2

我想知道如何改變與一個VisualizationViewer與jung關聯的佈局的大小?如何在使用採摘模式時使用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 2011-04-23 09:00:56

+0

您將需要更改VV尺寸(使用setSize())以及佈局尺寸。 (這可能有助於將佈局和可視化座標空間視爲不同,因爲它們是。)完成之後,您需要刷新可視化。 – 2011-04-25 21:28:05

+0

我已經調查了這一點,但這並沒有使解決方案更接近。 實際上,您仍然可以將頂點放置在由satellitevisualizationviewer覆蓋的區域之外。考慮一個頂點可以被挑選並移動到「nord」並且擴展布局或者satellitevisualizationviewer的大小不會使頂點顯示出來。另一件事:刷新SatelliteVisualizationViewer是不夠的,我們不得不fireStateChange()。 – njames 2011-04-26 10:58:57

相關問題