グラフを作成して表示するプログラムを作成しています。
グラフを処理し、マウス リスナー ( 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;}
}
}
さて、物事を大局的に見ると、これは機能し、ループに入り、ノードを取得し、ループを正常に終了します。(不要なコードは再度省略)
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
が応答しない原因となっている可能性のあるアイデアはありますか? それは非常にランダムに見えるので、 aJMenuBar
はそれを壊します。