2

我想知道如何使用 Jung 更改与 VisualizationViewer 关联的布局大小?

我解释一下目的:实际上,当使用 SatelliteVisualizationViewer 时,我们可以选择一个节点并将其移动到 SatelliteVisualisationViewer 未覆盖的区域。

我们可以在 JUNG 发行版的 SatelliteViewDemo 类中看到这一点。启动演示,选择一个节点并将其移动到布局大小之外。该节点在 VisualizationViewer 中很好地显示,但在卫星视图中却没有。

因此,我尝试在 PickingGraphMousePlugin 的 MouseListener 中添加一些代码,特别是在 mouseReleased(...) 方法中,以便通过包含图形所有节点的矩形的大小来更新布局大小。这样做,应更新 SatelliteView。但是如何做到这一点?

编辑:很抱歉没有足够详细。事实上,改变布局大小并不会改变 SatelliteView,因此位于布局之外的顶点(经过挑选和移动操作)仍然没有被 SatelliteView 覆盖。

也许我错过了什么……

其实真正的问题是:如何改变 SatelliteVisualizationViewer 覆盖的区域?!!!

4

2 回答 2

0

听起来您对如何继续进行了很好的了解。你卡在哪一块了?改变布局大小?更新可视化?还有什么?

于 2011-04-23T01:38:49.297 回答
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());
        }
    }
}
于 2011-04-26T21:03:42.953 回答