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.connection
API 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);
}