2013-05-02 85 views
0

我用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); 
} 
+0

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。并使用真实和描述性的类名称,而不是'A'和'B'。 – 2013-05-02 05:19:29

+0

@AndrewThompson好的,我会编辑,但我已经尽力使它尽可能简单... – 2013-05-02 05:20:46

+0

有没有办法添加到这个队列?不是,只用编程方式1.通过使用Swing Action setEnabled()或2.通过创建自己的信号灯 – mKorbel 2013-05-02 05:21:44

回答

0

我想这会帮助你。

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

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

或者以你自己的方式使用SwingUtilities.invokeLater。我希望它能起作用。 Thankyou。

+0

我认为你必须发布'evt'到另一个ActionListener或Swing Action,那么您可以根据任何争议发送/调用单独/独立代码块的数量 – mKorbel 2013-05-02 05:37:22