0

我用 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);
}
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 回答