2011-04-22 104 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

相关问题