0

SWINGでプッシュボタン付きのシンプルなGUIを作りました。プッシュボタンは次のことを行います。

private void pushButtonActionPerformed(java.awt.event.ActionEvent evt) {
       SendInformation(); //a Listener function receives this information
       UseListenerValuesToDoSomething();
 }

ただし、リスナーは の最後まで実行されないため、これは失敗していpushButtonActionPerformedます。その時までに、UseListenerValuesToDoSomethingすでに戻ってきnullました。

したがって、JFrame には、リスナーの前に pushButton を実行させるイベント キューがあると思います。この場合、2 番目の関数をキューに追加する方法はありますか? そうすれば、Listener 関数から情報を受け取った後に 2 番目の関数が実行されます。

編集:実際のコードが役立つかどうかはわかりませんが、ここにあります。プログラムと API が必要なためコンパイルできませんが、何が起こっているのかをよりよく理解できることを願っています

private void tradeButtonActionPerformed(java.awt.event.ActionEvent evt) {      
        IBProgramInstance.connection.reqHistoricalData(1,contract1,...);
        IBProgramInstance.connection.reqHistoricalData(2,contract2,...);

        findMostActiveContract();

        IBProgramInstance.connection.reqHistoricalData(3,mostActiveContract,...);
} 

IBProgramInstance.connectionAPI InteractiveBrokers への EClientSocket 接続であり、APIreqHistoricalDataから履歴データを要求するメソッドです。メソッドの実際のドキュメントはhereです。のドキュメント.connectここにあります。これは、インスタンス.connectに名前を付けた変数であることに注意してください。EClientSocket

リスナーはreqHistoricalData実行時に呼び出されますが、私のコードでは、何らかの理由で pushButton が完了するまで呼び出されません。

public void findMostActiveContract(){

   int largest = 0;
   int largestKey = 0;

   //volumes is a HashMap that fills a key and the volume of a contract through the Listener. 
   //Thus I need the Listener to run before this function runs. 

   Iterator<Map.Entry<Integer,Integer>> it2 = volumes.entrySet().iterator();  

   // use iterator to determine which contract has largest volume.

   while(it2.hasNext()){
        Map.Entry<Integer,Integer> entry2 = it2.next();
        if (entry2.getValue()>largest){
            largest = entry2.getValue();
            largestKey = entry2.getKey();
        }
   }

   mostActiveContract = contractList.get(largestKey);
}
4

1 に答える 1

0

これが役立つと思います。

private void pushButtonActionPerformed(java.awt.event.ActionEvent evt) {
       A();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        B();
       }
  });
 }

または、独自の方法で SwingUtilities.invokeLater を使用します。うまくいくことを願っています。ありがとうございました。

于 2013-05-02T05:31:52.097 に答える