我用SWING中的一个按钮制作了一个简单的GUI。该按钮执行以下操作:由于JFrame造成的队列问题
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
更好的主意是EClientSocket连接到API InteractiveBrokers和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);
}
为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。并使用真实和描述性的类名称,而不是'A'和'B'。 – 2013-05-02 05:19:29
@AndrewThompson好的,我会编辑,但我已经尽力使它尽可能简单... – 2013-05-02 05:20:46
有没有办法添加到这个队列?不是,只用编程方式1.通过使用Swing Action setEnabled()或2.通过创建自己的信号灯 – mKorbel 2013-05-02 05:21:44