Как обновить размер макета с Юнгом при использовании режима пикинга?

Мне интересно, как изменить размер макета, связанного с VisualizationViewer, с помощью jung?

Объясняю цель: на самом деле, при использовании SatelliteVisualizationViewer мы можем выбрать узел и переместить его в область, не охваченную SatelliteVisualizationViewer.

Мы можем видеть это в классе SatelliteViewDemo в дистрибутиве JUNG. Запустите демонстрацию, выберите узел и переместите его за пределы размера макета. Узел хорошо отображается в VisualizationViewer, но не в виде спутника.

Итак, я пытаюсь добавить некоторый код в MouseListener PickingGraphMousePlugin, в частности, в метод mouseReleased(...), чтобы обновить размер макета на размер прямоугольника, содержащего все узлы графа. При этом SatelliteView должен быть обновлен. Но как это сделать?

Изменить: Извините, что недостаточно подробно. На самом деле, изменение размера компоновки не меняет SatelliteView, поэтому вершины, расположенные за пределами компоновки (после операции выбора и перемещения), по-прежнему не покрываются SatelliteView.

Может я что-то пропустил...

На самом деле реальный вопрос: как изменить область, охватываемую SatelliteVisualizationViewer? !!!


person njames    schedule 22.04.2011    source источник


Ответы (2)


Похоже, у вас есть довольно хорошее представление о том, как действовать дальше. На каком куске ты застрял? Изменение размера макета? Обновить визуализацию? Что-то другое?

person Joshua O'Madadhain    schedule 23.04.2011
comment
Извините, что недостаточно подробно описал. На самом деле, изменение размера компоновки не меняет SatelliteView, поэтому вершины, расположенные за пределами компоновки (после операции выбора и перемещения), по-прежнему не покрываются SatelliteView. Может быть, я что-то упустил... На самом деле реальный вопрос: как изменить область, охватываемую SatelliteVisualizationViewer? !!! - person njames; 23.04.2011
comment
Вам нужно будет изменить размеры VV (используя setSize()), а также размеры макета. (Может быть полезно думать о пространстве координат компоновки и визуализации как о разных пространствах, потому что они разные.) После того, как вы это сделаете, вам нужно будет обновить визуализацию. - person Joshua O'Madadhain; 26.04.2011
comment
Я исследовал это, но это не приближает решение. На самом деле вы все еще можете поместить вершину за пределы области, охватываемой спутниковой визуализацией. Подумайте о том, что вершину можно выбрать и переместить на север, а расширение макета или размер спутниковой визуализации не отобразит вершину. Еще один момент: обновления SatelliteVisualizationViewer недостаточно, мы должны вызвать fireStateChange(). - person njames; 26.04.2011

Я хотел автоматически обновлять вид со спутника относительно 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());
        }
    }
}
person njames    schedule 26.04.2011