我用 SWING 中的按钮制作了一个简单的 GUI。按钮执行以下操作:
private void pushButtonActionPerformed(java.awt.event.ActionEvent evt) {
SendInformation(); //a Listener function receives this information
UseListenerValuesToDoSomething();
}
但是,这是失败的,因为侦听器直到pushButtonActionPerformed
. 到时候UseListenerValuesToDoSomething
已经回来了null
。
所以我认为 JFrame 中有一个事件队列会导致 pushButton 在我的侦听器之前执行。如果是这种情况,有没有办法将我的第二个函数添加到队列中?这样我的第二个函数将在接收到来自 Listener 函数的信息后执行。
编辑:我不确定我的实际代码是否会有所帮助,但就是这样。它不会编译,因为您需要程序和 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 连接,reqHistoricalData
是他们从 api 请求历史数据的方法。该方法的实际文档在这里。文档在.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);
}