我正在创建一个创建和显示图形的程序。
我有一个处理图形并实现鼠标监听器(Graphstream ViewerListener
)的类。
为了获取事件,您需要使用循环并调用pump()方法,直到完成为止。
要显示图表,Graphstream
库有一个可以扩展的View对象,可以用作常规Jpanel
,只需将View对象设置为JFrame
中的内容窗格即可
与JFrame
一起使用没有菜单栏时,我的班级工作正常。
但是当我在JMenuBar
设置JFrame
时,问题就开始了。
我在我的图形类中调用该方法,它进入循环内部,但ViewerListener
不起作用,就像它没有监听事件一样。为什么呢?
这是我的类代码,省略了不必要的东西
public class GeneratedGraph implements ViewerListener{
public String[] getNodes(){
boolean flag=true;
startEndNodes[0]=null; startEndNodes[1]=null;
arrayposition=0;
while(flag){
System.out.println("Inside the loop");
fromViewer.pump();
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(startEndNodes[0]!=null && startEndNodes[1]!=null){
flag=false;
}
}
System.out.println("Outside the loop");
return startEndNodes;
}
public void buttonPushed(String id) { //This method fires up when you click on a node
System.out.println("Button pushed on node "+id);
startEndNodes[arrayposition]=id;
arrayposition++;
if(arrayposition>1){ arrayposition=0;}
}
}
现在,为了把事情放到透视图中,这个WORKS进入,抓取节点,并退出循环。 (不必要的代码再次省略)
public class main extends implements ActionListener {
public static void main(String args[]){
JFrame mainFrame = new JFrame("Graph");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GeneratedGraph myGraph = new GeneratedGraph(mainFrame);
myGraph.option1(5,6); //a method which creates a graph
myGraph.show();
mainFrame.pack();
mainFrame.setVisible(true);
String s[] = myGraph.getNodes();
}
}
但是当我添加它时,它没有。它只是进入循环,来自ViewerListener
的事件永远不会触发,因此它会卡住。
public class main extends implements ActionListener {
public static void main(String args[]){
JFrame mainFrame = new JFrame("Graph");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar= new JMenuBar();
mainFrame.setJMenuBar(menuBar);
JMenu algorithmMenu = new JMenu("Algorithms");
JMenuItem dijkstra = new JMenuItem("Dijkstra");
dijkstra.addActionListener(this);
dijkstra.setActionCommand("Dijkstra");
algorithmMenu.add(dijkstra);
menuBar.add(algorithmMenu);
GeneratedGraph myGraph = new GeneratedGraph(mainFrame);
myGraph.option1(5,6); //a method which creates a graph
myGraph.show();
mainFrame.pack();
mainFrame.setVisible(true);
String s[] = myGraph.getNodes();
}
}
似乎打破一切的部分就是这个
menuBar.add(algorithmMenu);
当我注释掉这个特定的行时,它运行正常。
可能导致ViewerListener
不回应的任何想法?它似乎是随机的,JMenuBar
会破坏它。