2017-02-13 190 views
0

我已經增加了一個JRadioButtonJPanel和處理其鼠標單擊事件如下Java代碼處理併發事件的Java Swing事件處理

JRadioButton offline = new JRadioButton(); 
    offline.setText("Offline Mode"); 

    modePanel.add(offline); 

    modePanel.setLayout(new GridLayout(2,1)); 
    offline.addMouseListener(new java.awt.event.MouseAdapter() { 
       public void mouseClicked(java.awt.event.MouseEvent evt) { 
        offlineClicked(evt); 
       } 
      }); 

功能offlineClicked需要大約四周1分鐘是完全執行。 並且直到它的執行完成,沒有其他操作執行被處理。

此後執行的所有操作似乎進入事件隊列並在offlineClicked完成執行時處理FIFO。

由於此,UI 似乎已進入掛起狀態。

可以做什麼來使擺動控制器事件同時發生,而不是等到最後才完全執行。

+3

標準技術是永遠不要在事件線程上做應用程序工作。 始終在單獨的處理線程上運行應用程序工作,以便UI保持響應。有關此主題的完整書籍和教程,請執行一些Google搜索。從Oracle的教程開始。 –

+2

您正在尋找按鈕上的'SwingWorker'和'ActionListener'; [例如('SwingWorker')](http://stackoverflow.com/questions/20944719/how-to-use-swingworker/20945255#20945255) – MadProgrammer

+0

每次點擊處理都很重要嗎?或者你想要點擊被忽略,直到完成第一次點擊的初始過程? - 在實現併發解決方案時(即使使用SwingWorker等),您必須考慮到這一點。 – Fildor

回答

0

當mouselistener事件被觸發時,它將在事件調度線程(重繪屏幕的swing gui thead)上運行。如果你把邏輯代碼放在gui線程中,那麼你的gui會凍結,直到邏輯完成並將gui線程返回到swing。你可以使用swingworker,或者另一個選項是簡單地啓動一個新線程,讓gui線程返回,這樣可以讓其他的gui事件處理。在新線程中執行耗時的邏輯,它將從事件循環運行,因此擺動不會像運行異步一樣凍結。你必須在調度線程上運行所有的swing代碼,所以當邏輯完成後,因爲你不再在調度線程上,你必須將它添加到事件隊列中。

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     // you can now safely use swing components 
     new frame.setVisible(true); 
    } 
});