由于JFrame导致队列问题

时间:2013-05-02 05:17:40

标签: java swing jframe

我在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);
}

1 个答案:

答案 0 :(得分:0)

我认为这会对你有帮助。

private void pushButtonActionPerformed(java.awt.event.ActionEvent evt) {
       A();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        B();
       }
  });
 }

或者以你自己的方式使用SwingUtilities.invokeLater。我希望它能运作。 三江源。