2013-05-02 84 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