Я хочу создать всплывающее меню, которое появится, если я щелкну правой кнопкой мыши на холсте. Как я могу это сделать? какую функцию я должен изменить? Любая помощь будет оценена по достоинству.
Всплывающее меню при щелчке правой кнопкой мыши в JUNG
Ответы (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
Кстати, как я могу прочитать java-файл из библиотеки jung? я имею в виду, что раньше я изучил C++ (Visual Basic), и я могу щелкнуть правой кнопкой мыши по любой функции и открыть исходный файл, чтобы увидеть, как все работает внутри (код для этой функции). Я не знаю, как я могу сделать то же самое с java (я использую eclipse)? пишет источник не найден.
- person Fadhlie Ikram; 22.05.2012
Кроме того, всплывающее окно мыши работает лучше всего, оно запускается, но не появляется, когда я нажимаю правую кнопку мыши.
- person Fadhlie Ikram; 22.05.2012
* обновление кажется, что происходит событие, потому что я смог распечатать фиктивный оператор, который я установил в консоли. но фактическое меню все еще не появилось. В чем может быть проблема?
- person Fadhlie Ikram; 22.05.2012
@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
Извините, я обновлю свой пост, чтобы показать, где следует использовать приведенный выше пример класса.
- person ecle; 22.05.2012
stackoverflow.com/questions/8226624/
- person ecle; 22.05.2012
Если вы не хотите компилировать из исходников maven, вы можете добавить
jung-samples-x.y.z.jar
в качестве библиотеки, на которую ссылаются, в разделе «Библиотеки, на которые ссылаются», в вашем проекте Eclipse. Откройте путь сборки проекта, перейдите на вкладку «Библиотеки» и измените данную ссылку, чтобы установить ее исходное вложение с помощью jung-samples-x.y.z-sources.jar
- person ecle; 22.05.2012
Извините, но я потерялся после перехода на вкладку «Библиотека». что собственно мне делать дальше?
- person Fadhlie Ikram; 22.05.2012
Перефразировано: откройте путь сборки проекта, перейдите на вкладку «Библиотеки», выберите
jung-samples-x.y.z.jar
в главном дереве (если вы добавили банку), откройте его поддерево, чтобы установить исходное вложение с помощью jung-samples-x.y.z-sources.jar
- person ecle; 22.05.2012
См. мой обновленный пост, чтобы использовать класс
PopupGraphMousePlugin
с классом AbstractModalGraphMouse
, так как я пропустил его в исходном посте.
- person ecle; 22.05.2012
Или, пожалуйста, покажите, что вы пробовали (разместив это в своем существующем сообщении или создав новое сообщение, чтобы избежать путаницы)
- person ecle; 22.05.2012
Хорошо. постараюсь обновить мой код и свяжусь с вами, когда получу результат. Спасибо за помощь! действительно ценю это! Кстати, я не знаю, как разместить код здесь. есть ли расширенный вариант, такой как форум, который обеспечивает простое форматирование текста и теги.
- 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
Почти готово, но вы забыли включить метод, показывающий всплывающее меню
popup.show(vv, e.getX(), e.getY());
- person ecle; 22.05.2012
Это не совсем вопрос JUNG — холст — это просто стандартный холст Swing с некоторыми дополнительными возможностями, и вы не щелкаете по элементу графика — но GraphEditorDemo и PluggableRendererDemo демонстрируют нечто подобное.
person
Joshua O'Madadhain
schedule
11.05.2012
да, я уже вижу GraphEditorDemo, но кажется, что всплывающее меню Create Vertex не было в том же файле. Я не мог найти, где в коде реализация jpopup меню Create Vertex.
- person Fadhlie Ikram; 13.05.2012
Кстати, как я могу прочитать java-файл из библиотеки jung? я имею в виду, что раньше я изучил C++ (Visual Basic), и я могу щелкнуть правой кнопкой мыши по любой функции и открыть исходный файл, чтобы увидеть, как все работает внутри (код для этой функции). Я не знаю, как я могу сделать то же самое с java (я использую eclipse)? пишет источник не найден.
- person Fadhlie Ikram; 22.05.2012
person
schedule
@eee, не могли бы вы проверить, почему это не работает, когда я щелкнул правой кнопкой мыши по холсту. Текст-пустышка не отображался. Код из PluggableRendererDemo, который я пытаюсь изменить.
- person Fadhlie Ikram; 06.06.2012
@ Джошуа О'Мададхейн, не могли бы вы проверить код, почему он не работает, когда я нажимаю на холст?
- person Fadhlie Ikram; 06.06.2012