我想创建一个弹出式菜单,如果我右键单击画布,就会出现这个菜单。我怎样才能做到这一点?我应该修改哪个函数?任何帮助,将不胜感激。在JUNG使用鼠标右键弹出菜单
回答
下面的代码将创建时右击无论是在顶点或画布上的弹出菜单......
/**
* 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());
上面的代码可以工作。但是,如果对通用零件使用不同的用户数据,则需要修改代码以适应您的设计。
这不是一个特别的JUNG问题 - 画布只是一个标准问题的Swing画布,其中一些额外的功能已移植,而您没有单击图形元素 - 但GraphEditorDemo和PluggableRendererDemo展示了类似的东西。
是的,我已经看到GraphEditorDemo,但似乎创建顶点弹出菜单不在同一个文件中。我找不到代码中的“创建顶点”jpopup菜单的实现。 –
顺便说一句,我如何从jung库中读取java文件?我的意思是,之前,我学习C++(visual basic),并且我可以右键单击任何函数,并打开源文件以查看引擎盖下的工作情况(该函数的代码)。我不知道我怎么可以用java(即时通讯使用eclipse)做同样的事情?它说源未找到。 –
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
这就是从您的第一代码的一个
这是第二部分
/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));
几乎在那里,但你忘记了包括显示弹出式菜单'popup.show(vv,e.getX(),e.getY());' – ecle
@eee 谢谢!现在它工作! –
protected void handlePopup(MouseEvent e) {
final VisualizationViewer<Integer,Number> vv = (VisualizationViewer<Integer,Number>)e.getSource();
Point2D p = e.getPoint();
//vv.getRenderContext().getBasicTransformer().inverseViewTransform(e.getPoint());
GraphElementAccessor<Integer,Number> pickSupport = vv.getPickSupport();
if(pickSupport != null) {
System.out.println("POPUP MOUSE is not NULL!");
final Integer v = pickSupport.getVertex(vv.getGraphLayout(), p.getX(), p.getY());
if(v != null) {
JPopupMenu popup = new JPopupMenu();
popup.add(new AbstractAction("Decrease Transparency") {
public void actionPerformed(ActionEvent e) {
Double value = Math.min(1,transparency.get(v).doubleValue()+0.1);
transparency.put(v, value);//vertex, value
vv.repaint();
}
});
popup.add(new AbstractAction("Increase Transparency"){
public void actionPerformed(ActionEvent e) {
Double value = Math.max(0,
transparency.get(v).doubleValue()-0.1);
transparency.put(v, value);
vv.repaint();
}
});
popup.show(vv, e.getX(), e.getY());
}
else {
final Number edge = pickSupport.getEdge(vv.getGraphLayout(), p.getX(), p.getY());
if(edge != null) {
JPopupMenu popup = new JPopupMenu();
popup.add(new AbstractAction(edge.toString()) {
public void actionPerformed(ActionEvent e) {
System.err.println("got "+edge);
}
});//popup.add
popup.show(vv, e.getX(), e.getY());
}//if edge != null)
}
}// if(pickSupport != null)
//rightclicked on Canvas
else{
System.out.println("On Canvas!");
}
}//handlePopup(MouseEvent e)
@eee 可以请你检查一下为什么这样做的工作,当我右键单击画布上。虚拟文本没有显示。代码来自PluggableRendererDemo,即时尝试修改。 –
@Joshua O'Madadhain 请你检查一下代码为什么当我点击画布时无法工作? –
nvm。问题解决了。 –
- 1. 右键菜单同时使用键盘和鼠标
- 2. 弹出窗口中的右键菜单
- 3. 在jTree上创建一个右键菜单弹出菜单
- 4. Selenium IDE鼠标滚动弹出菜单?
- 5. 如何在GridControl行上右键单击弹出菜单?
- 6. Tkinter在OSX上右键单击弹出菜单无响应
- 7. 在WinRT中显示弹出式右键单击样式菜单
- 8. 如何在jTable行中添加右键单击弹出菜单?
- 9. 在“菜单键”上按下,ContextMenuStrip不会在鼠标光标位置弹出
- 10. CSS和HTML水平弹出菜单 - 右侧弹出菜单
- 11. 鼠标按键模拟 - 右键和上下文菜单问题
- 12. Gmap3标记右键菜单
- 13. opengl菜单每次调用鼠标右键点击
- 14. 右键单击datagrid单元格以弹出复制菜单(ContextMenu)
- 15. g_signal_connect用于单击鼠标右键?
- 16. 用鼠标右键单击NSStatusItem
- 17. GTK弹出菜单没有出现在鼠标的位置
- 18. 如何禁用鼠标右键菜单,当在Firefox中按下shift键时?
- 19. 打开弹出菜单只在鼠标单击摆动
- 20. 调用从键盘右键单击鼠标右箭头的keydown
- 21. 处理中的右键单击弹出菜单
- 22. 当我右键单击鼠标不显示在新标签菜单中打开
- 23. 菜单左,右键菜单
- 24. 如何使一个菜单鼠标释放后弹出
- 25. 我如何添加鼠标右键菜单的NSCollectionViewItem
- 26. 如何为jface treeviewer创建鼠标右键菜单
- 27. C#:使用鼠标右键拖拽
- 28. 使用java左键点击任务栏图标打开弹出菜单(菜单)
- 29. 如何在用户右键单击JList中的项目时弹出菜单?
- 30. Chrome扩展程序 - 在鼠标上显示弹出式菜单
谢谢。会研究这个代码并且更新出来! –
btw,如何从jung库读取java文件?我的意思是,之前,我学习C++(visual basic),并且我可以右键单击任何函数,并打开源文件以查看引擎盖下的工作情况(该函数的代码)。我不知道我怎么可以用java(即时通讯使用eclipse)做同样的事情?它说源未找到。 –
也,鼠标弹出dowest工作,它运行,但当我按右键单击时弹出。 –