我在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请求历史数据的方法。该方法的实际文档是here。 .connect
的文档是here请注意,.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);
}
答案 0 :(得分:0)
我认为这会对你有帮助。
private void pushButtonActionPerformed(java.awt.event.ActionEvent evt) {
A();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
B();
}
});
}
或者以你自己的方式使用SwingUtilities.invokeLater。我希望它能运作。 三江源。