Всплывающее меню при щелчке правой кнопкой мыши в JUNG

Я хочу создать всплывающее меню, которое появится, если я щелкну правой кнопкой мыши на холсте. Как я могу это сделать? какую функцию я должен изменить? Любая помощь будет оценена по достоинству.


person Fadhlie Ikram    schedule 11.05.2012    source источник


Ответы (4)


Следующий код создаст всплывающее меню при щелчке правой кнопкой мыши по вершине или по холсту...

/**
 * a GraphMousePlugin that offers popup
 * menu support
 */
protected class PopupGraphMousePlugin extends AbstractPopupGraphMousePlugin
implements MouseListener {

    public PopupGraphMousePlugin() {
        this(MouseEvent.BUTTON3_MASK);
    }
    public PopupGraphMousePlugin(int modifiers) {
        super(modifiers);
    }

    /**
     * If this event is over a station (vertex), pop up a menu to
     * allow the user to perform a few actions; else, pop up a menu over the layout/canvas
     *
     * @param e
     */
    protected void handlePopup(MouseEvent e) {
        final VisualizationViewer<GeoLocation.Station,GeoLocation.Link> vv =
                (VisualizationViewer<GeoLocation.Station,GeoLocation.Link>)e.getSource();
        final Point2D p = e.getPoint();
        final Point2D ivp = p;

        GraphElementAccessor<GeoLocation.Station,GeoLocation.Link> pickSupport = vv.getPickSupport();
        if(pickSupport != null) {

            JPopupMenu popup = new JPopupMenu();

            final GeoLocation.Station station = pickSupport.getVertex(vv.getGraphLayout(), ivp.getX(), ivp.getY());

            if(station != null) {
                boolean isRadio = station.getParentSet().contains(STATION_IDENTIFIER_KEY);

                if(isRadio)
                    if (station.getId().equalsIgnoreCase(SneakPeek.getUsername())){

                        String follow = "Follow " + station.getId();
                        if (followLocal){
                            follow = "Do not follow " + station.getId();
                        }
                        else {
                            follow = "Follow " + station.getId();
                        }

                        popup.add(new AbstractAction("<html><center>" + follow) {
                            public void actionPerformed(ActionEvent e) {

                                followLocal = !followLocal;

                            }
                        });

                    }

                if(popup.getComponentCount() > 0) {
                    popup.show(vv, e.getX(), e.getY());
                }
            }
        }
        else { //to pop-up over the canvas/layout rather than over the station

            popup.add(new AbstractAction("Create Unit") {
                public void actionPerformed(ActionEvent e) {
                    //do something here
                }
            });


            if(popup.getComponentCount() > 0) {
                popup.show(vv, e.getX(), e.getY());
            }
        }

    }
}

Добавьте класс в класс AbstractModalGraphMouse, который обрабатывает прослушиватели мыши, чтобы заставить его работать:

private AbstractModalGraphMouse graphMouse;
...
graphMouse = new DefaultModalGraphMouse<Object, Object>();
vvMap.setGraphMouse(graphMouse);
graphMouse.add(new PopupGraphMousePlugin());

Приведенные выше коды работают. Но если вы используете другие пользовательские данные для общих деталей, вам необходимо изменить коды в соответствии с вашим дизайном.

person ecle    schedule 19.05.2012
comment
Кстати, как я могу прочитать java-файл из библиотеки jung? я имею в виду, что раньше я изучил C++ (Visual Basic), и я могу щелкнуть правой кнопкой мыши по любой функции и открыть исходный файл, чтобы увидеть, как все работает внутри (код для этой функции). Я не знаю, как я могу сделать то же самое с java (я использую eclipse)? пишет источник не найден. - person Fadhlie Ikram; 22.05.2012
comment
Кроме того, всплывающее окно мыши работает лучше всего, оно запускается, но не появляется, когда я нажимаю правую кнопку мыши. - person Fadhlie Ikram; 22.05.2012
comment
* обновление кажется, что происходит событие, потому что я смог распечатать фиктивный оператор, который я установил в консоли. но фактическое меню все еще не появилось. В чем может быть проблема? - person Fadhlie Ikram; 22.05.2012
comment
@Joshua O'Madadhain final String pickV = pickSupport.getVertex(vv.getGraphLayout(),ivp.getX(), ivp.getY()); if(pickV != null) { System.out.println(pickVisnotNull); popup.add (новый AbstractAction (Добавить новый) { - person Fadhlie Ikram; 22.05.2012
comment
Извините, я обновлю свой пост, чтобы показать, где следует использовать приведенный выше пример класса. - person ecle; 22.05.2012
comment
stackoverflow.com/questions/8226624/ - person ecle; 22.05.2012
comment
Если вы не хотите компилировать из исходников maven, вы можете добавить jung-samples-x.y.z.jar в качестве библиотеки, на которую ссылаются, в разделе «Библиотеки, на которые ссылаются», в вашем проекте Eclipse. Откройте путь сборки проекта, перейдите на вкладку «Библиотеки» и измените данную ссылку, чтобы установить ее исходное вложение с помощью jung-samples-x.y.z-sources.jar - person ecle; 22.05.2012
comment
Извините, но я потерялся после перехода на вкладку «Библиотека». что собственно мне делать дальше? - person Fadhlie Ikram; 22.05.2012
comment
Перефразировано: откройте путь сборки проекта, перейдите на вкладку «Библиотеки», выберите jung-samples-x.y.z.jar в главном дереве (если вы добавили банку), откройте его поддерево, чтобы установить исходное вложение с помощью jung-samples-x.y.z-sources.jar - person ecle; 22.05.2012
comment
См. мой обновленный пост, чтобы использовать класс PopupGraphMousePlugin с классом AbstractModalGraphMouse, так как я пропустил его в исходном посте. - person ecle; 22.05.2012
comment
Или, пожалуйста, покажите, что вы пробовали (разместив это в своем существующем сообщении или создав новое сообщение, чтобы избежать путаницы) - person ecle; 22.05.2012
comment
Хорошо. постараюсь обновить мой код и свяжусь с вами, когда получу результат. Спасибо за помощь! действительно ценю это! Кстати, я не знаю, как разместить код здесь. есть ли расширенный вариант, такой как форум, который обеспечивает простое форматирование текста и теги. - person Fadhlie Ikram; 22.05.2012

protected class PopupGraphMousePlugin extends AbstractPopupGraphMousePlugin implements      MouseListener {

    public PopupGraphMousePlugin() {
        this(MouseEvent.BUTTON3_MASK);
    }
    public PopupGraphMousePlugin(int modifiers) {
        super(modifiers);
    }

    /**
     * If this event is over a station (vertex), pop up a menu to
     * allow the user to perform a few actions; else, pop up a menu over the layout/canvas
     *
     * @param e
     */
    @SuppressWarnings("unchecked")
    protected void handlePopup(MouseEvent e) {
        final VisualizationViewer<String,String> vv =(VisualizationViewer<String,String>)e.getSource();
        final Point2D p = e.getPoint();
        final Point2D ivp = p;
        JPopupMenu popup = new JPopupMenu();

        System.out.println("mouse event!");


        GraphElementAccessor<String,String> pickSupport = vv.getPickSupport();
        System.out.println("GraphElementAccessor!");
        if(pickSupport != null) {



            final String pickV = pickSupport.getVertex(vv.getGraphLayout(), ivp.getX(), ivp.getY());

            if(pickV != null) {
               System.out.println("pickVisnotNull");


               popup.add(new AbstractAction("Add New") {
                   /**
                 * 
                 */


                public void actionPerformed(ActionEvent e) {
                   System.out.println("person added");  
                   }
               });//new abstraction

            }
        }///if picksupport



    }//handlePopup(MouseEvent e)
}//PopupGraphMousePlugin

это тот, что из вашего 1-го кода

это вторая часть

/Next, let's just build a simple mouse, to allow picking, translating, and zooming.
    AbstractModalGraphMouse gMouse = new DefaultModalGraphMouse<Object, Object>();
    vv.setGraphMouse(gMouse); //Add the mouse to our Visualization-Viewer.
    //PluggableGraphMouse pgm = new PluggableGraphMouse();
    gMouse.add(new PickingGraphMousePlugin<Object, Object>());
    //pgm.add(new TranslatingGraphMousePlugin(MouseEvent.BUTTON3_MASK));
    gMouse.add(new PopupGraphMousePlugin());
    gMouse.add(new ScalingGraphMousePlugin(new CrossoverScalingControl(), 0, 1 / 1.1f, 1.1f));
person Fadhlie Ikram    schedule 22.05.2012
comment
Почти готово, но вы забыли включить метод, показывающий всплывающее меню popup.show(vv, e.getX(), e.getY()); - person ecle; 22.05.2012

Это не совсем вопрос JUNG — холст — это просто стандартный холст Swing с некоторыми дополнительными возможностями, и вы не щелкаете по элементу графика — но GraphEditorDemo и PluggableRendererDemo демонстрируют нечто подобное.

person Joshua O'Madadhain    schedule 11.05.2012
comment
да, я уже вижу GraphEditorDemo, но кажется, что всплывающее меню Create Vertex не было в том же файле. Я не мог найти, где в коде реализация jpopup меню Create Vertex. - person Fadhlie Ikram; 13.05.2012
comment
Кстати, как я могу прочитать java-файл из библиотеки jung? я имею в виду, что раньше я изучил C++ (Visual Basic), и я могу щелкнуть правой кнопкой мыши по любой функции и открыть исходный файл, чтобы увидеть, как все работает внутри (код для этой функции). Я не знаю, как я могу сделать то же самое с java (я использую eclipse)? пишет источник не найден. - person Fadhlie Ikram; 22.05.2012

person    schedule
comment
@eee, не могли бы вы проверить, почему это не работает, когда я щелкнул правой кнопкой мыши по холсту. Текст-пустышка не отображался. Код из PluggableRendererDemo, который я пытаюсь изменить. - person Fadhlie Ikram; 06.06.2012
comment
@ Джошуа О'Мададхейн, не могли бы вы проверить код, почему он не работает, когда я нажимаю на холст? - person Fadhlie Ikram; 06.06.2012