我用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