2014-10-28 53 views
1

我想建立一個JFrame能夠運行一個後臺任務每次JButton被點擊。當前我正在使用一個swing工作人員,它不會允許任務被執行多次。重複SwingWorker

我怎樣才能啓用SwingWorkerJButton點擊重複任務。

public class ScanFileFrame extends JFrame{ 

    JButton btnTicking; 
    JLabel label1; 

    ScanFileFrame(){ 

     JFrame jframe = new JFrame(); 
     jframe.setLayout(new FlowLayout()); 
     btnTicking = new JButton("Start Scanning Files"); 
     label1 = new JLabel("No File Scanned"); 

     btnTicking.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0) { 
       worker.execute(); 

      } 
     }); 

     jframe.add(btnTicking); 
     jframe.add(label1); 

     jframe.setVisible(true); 
     jframe.setSize(300,300); 
    } 

    SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() { 

     @Override 
     protected Boolean doInBackground() throws Exception { 

      // Simulate scan file 
      System.out.println("scanning files ...."); 
      Thread.sleep(2000); 

      return true; 

     } 

     //update jframe jlabel when background task finish 
     protected void done() { 
      label1.setText("Files Scanned"); 
      System.out.println("complete"); 
     } 
    }; 

    public static void main(String[] args){ 
     ScanFileFrame f = new ScanFileFrame(); 

    } 
} 
+2

*「使用揮杆工並且不允許任務被執行多次」*因此創建另一個。有什麼問題?爲了更快地獲得更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整可驗證示例)。 – 2014-10-28 02:16:57

+0

哦,我如何實現它,因爲它將取決於用戶點擊。有沒有辦法可以自動創建一個新用戶時,我click.sorry是新的,有很多東西需要學習 – 2014-10-28 02:20:34

+0

我將修改我的代碼.. – 2014-10-28 02:22:01

回答

5

目前我使用的是擺動的工人,它不會允許任務被多次執行。

這不是問題,因爲您只是構建一個新的SwingWorker並在JButton的ActionListener中運行它。據我所知,這個解決你的問題,因爲它是目前編寫。如果您需要更詳細的答案,那麼您需要在您的問題中提供更多詳細信息。


編輯幽州:

,但我不知道如何重塑的SwingWorker每次用戶點擊掃描按鈕。

你是如何 「再造」 任何對象?通過創建一個新的實例,這裏是一個新的MySwingWorker,然後調用execute。


例如,

import java.awt.*; 
import java.awt.event.*; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.concurrent.ExecutionException; 

import javax.swing.*; 

public class ScanFileFrame { 
    private FileScanAction fileScanAction = new FileScanAction("Scan Files", KeyEvent.VK_S); 
    private JButton btnTicking = new JButton(fileScanAction); 
    private JLabel label1; 
    private MyFileScanWorker worker; 

    ScanFileFrame() { 

     JFrame jframe = new JFrame(); 
     jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     jframe.setLayout(new FlowLayout()); 
     label1 = new JLabel("  No File Scanned  ", SwingConstants.CENTER); 

     jframe.add(btnTicking); 
     jframe.add(label1); 
     jframe.pack(); 
     jframe.setLocationByPlatform(true); 
     jframe.setVisible(true); 

    } 

    @SuppressWarnings("serial") 
    private class FileScanAction extends AbstractAction { 
     public FileScanAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     label1.setText("Scanning Files"); 
     fileScanAction.setEnabled(false); 
     worker = new MyFileScanWorker(); 
     worker.addPropertyChangeListener(new WorkerListener()); 
     worker.execute(); 
     } 
    } 

    private class WorkerListener implements PropertyChangeListener { 
     @Override 
     public void propertyChange(PropertyChangeEvent pcEvt) { 
     if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) { 
      fileScanAction.setEnabled(true); 
      try { 
       boolean success = worker.get(); 
       String text = success ? "Scanning Successful" : "Scanning Error"; 
       label1.setText(text); 
      } catch (InterruptedException | ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
     } 
    } 

    private class MyFileScanWorker extends SwingWorker<Boolean, Void> { 

     @Override 
     protected Boolean doInBackground() throws Exception { 
     // Simulate scan file 
     Thread.sleep(2000); 

     // have it work successfully 2/3 of the time. 
     if (Math.random() > 0.3333) { 
      return true; 
     } else { 
      return false; 
     } 
     } 
    }; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new ScanFileFrame(); 
     } 
     }); 
    } 
} 

需要注意的是,你總是要調用get()在你的SwingWorker,它已經完成後,即使它返回null,這樣就可以捕獲可能期間發生的任何異常SwingWorker的運行。

+0

對不起,我編輯併發布了一個簡化的代碼。基本上它會調用scanFile方法並在按鈕點擊的背景下運行。但我不知道如何在用戶每次點擊掃描按鈕時重新創建擺動工具。 – 2014-10-28 02:50:47

+0

所以在jbutton actionlistener我將需要編輯worker.execute()不是嗎? :) – 2014-10-28 02:55:27

+0

@beNice:參見上面的示例代碼。 – 2014-10-28 03:06:31