1

グラフを作成して表示するプログラムを作成しています。

グラフを処理し、マウス リスナー ( Graphstream ViewerListener) を実装するクラスがあります。イベントを取得するには、ループを使用して終了するまで pump() メソッドを呼び出す必要があります。

グラフを表示するために、Graphstreamライブラリには View オブジェクトがあり、これを拡張して通常の として使用できますJpanel。View オブジェクトを のコンテンツ ペインとして設定するだけJFrameです。

JFrameメニューバーなしで使用すると、私のクラスは正常に動作します。

しかし、 を に設定するJMenuBarJFrame、問題が発生します。グラフ クラス内でメソッドを呼び出すと、ループ内に入りますが、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はそれを壊します。

4

0 に答える 0