2

jungでVisualizationViewerに関連付けられたレイアウトのサイズを変更する方法を知りたいですか?

目的を説明します。実際には、SatelliteVisualizationViewer を使用する場合、ノードを選択して、SatelliteVisualisationViewer でカバーされていない領域に移動できます。

これは、JUNG ディストリビューションの SatelliteViewDemo クラスで確認できます。デモを起動し、ノードを選択してレイアウト サイズの外に移動します。ノードは VisualizationViewer では適切に表示されますが、サテライト ビューでは表示されません。

そこで、PickingGraphMousePlugin の MouseListener、具体的には mouseReleased(...) メソッドにコードを追加して、グラフのすべてのノードを含む四角形のサイズでレイアウト サイズを更新しようとしました。これを行うと、SatelliteView が更新されます。しかし、これを行う方法は?

編集:詳細が不十分で申し訳ありません。実際、レイアウト サイズを変更しても、SatelliteView は変更されないため、レイアウトの外側にある頂点 (ピック アンド ムーブ操作の後) は、SatelliteView によってカバーされません。

たぶん私は何かを逃した...

実際問題は、SatelliteVisualizationViewer がカバーするエリアを変更するにはどうすればよいかということです。!!!

4

2 に答える 2

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 に答える
0

進め方についてかなり良いアイデアをお持ちのようですね。あなたはどの部分にこだわっていますか?レイアウトサイズの変更?ビジュアライゼーションを更新していますか? 他の何か?

于 2011-04-23T01:38:49.297 に答える