2014-02-15 53 views
-1

我將SwingWorker命名爲Worker;Swingworkers無法獲取GUI變量

public class Worker extends SwingWorker<Void, Void> { 

       private MainProgramWindow mpw; 
       public Worker(MainProgramWindow mpw) { 
       this.mpw = mpw; 
       } 

       public String getStartDate(){ 
       String inputStringDate = mpw.startDateBox.getText(); 
       SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy"); 
       Date inputDate = null; 
       try { 
        inputDate = inputFormat.parse(inputStringDate); 
       } catch (ParseException ex) { 
        Logger.getLogger(MainProgramWindow.class.getName()).log(Level.SEVERE, null, ex); 
       } 

       SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 00:00:00.000"); 
       String outputStringDate = outputFormat.format(inputDate); 
       return outputStringDate; 
       } 



       public String getEndDate(){ 
       String inputStringDate = mpw.endDateBox.getText(); 
       SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy"); 
       Date inputDate = null; 
       try { 
        inputDate = inputFormat.parse(inputStringDate); 
       } catch (ParseException ex) { 
        Logger.getLogger(MainProgramWindow.class.getName()).log(Level.SEVERE, null, ex); 
       } 

       SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59.999"); 
       String outputStringDate = outputFormat.format(inputDate); 
       return outputStringDate; 
       } 




       @Override 
     protected Void doInBackground() throws Exception { 
     //here you make heavy task this is running in another thread not in EDT 
      int i = 50; 
      setProgress(i); 
       //Rest of code. 

      ResultSet rs1; 
      Statement stmt; 
      String query1 = "select date,id,dur from exampletable\n" + 
      "where adetdate between '"+getStartDate()+"' and '"+getEndDate()+"'"; 

      rs1 = stmt.executeQuery(query1); 

      //Rest of Code 

      while(i <= 100){ 
      setProgress(i++); 
      Thread.sleep(5); // random magic number 
      } 

     return null; 
     } 

    } 

工人成功運行並在指定位置創建excel文件。

我的問題是;當我用StartDate Chooser啓動程序GUI時 - EndDate Chooser - StartJob Buton。當布頓點擊一些進度條調用和進度條執行這個工人和進度條開始聆聽。

但工作人員始終使用第一個GUI顯示startdate和enddate的值。我在Worker中定義了兩個方法來獲取實際的startdate和enddate值並在String query1中使用它們。

爲什麼query1成功調用但不能識別的方法getStartDate()和getEndDate()我不明白。任何想法 ?

編輯: 另外我有PbarNEW類進度條;

package AgentStatGenerator; 

    //Imports here  

    public class PbarNEW extends JPanel { 

     JProgressBar pbar; 

     public PbarNEW() { 
     // initialize Progress Bar 
     pbar = new JProgressBar(); 
     // add to JPanel 
     add(pbar); 

     SwingWorker myWorker = new Worker(); 
     myWorker.addPropertyChangeListener(new PropertyChangeListener() { 
     @Override 
     public void propertyChange(final PropertyChangeEvent event) { 
     switch (event.getPropertyName()) { 
     case "progress": 
     pbar.setIndeterminate(false); 
     pbar.setValue((Integer) event.getNewValue()); 
     break; 
     } 
    } 
    }); 
     myWorker.execute(); 
    } 

     public static void main(String args[]) { 

     final PbarNEW it = new PbarNEW(); 

     JFrame frame = new JFrame("Progress Bar Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(it); 
     frame.pack(); 
     frame.setVisible(true); 


     } 
    } 

當我點擊MainProgramWindow中的Buton(主GUI)時,出現progresbar並開始監聽Worker。但是SwingWorker myWorker = new Worker();在Worker中創建構造函數後不工作。

private void createExcelButonActionPerformed(java.awt.event.ActionEvent evt) {             
    // TODO add your handling code here: 
     String[] arguments = new String[] {"123"}; 
     PbarNEW.main(arguments); 
} 

回答

0

您的工作人員將在創建實例時使用開始日期和結束日期。這是因爲您的查詢是在對象實例化時作爲成員變量創建的。

將查詢結構移到doInBackground中,您就可以了。

+0

感謝您的建議。我編輯我的代碼。添加一些實例並在doinbackround中移動Query blokc。但還是有同樣的問題發生。我選擇02.12.2014和02.12.2014,但是查詢在02.12.2014和02.15.2014執行(這些值在程序啓動時加載) – Lacrymae

1

請編輯您的問題拼寫和語法。正如所寫的那樣,閱讀起來非常困難,這使得難以理解你的問題。

至於你的問題,你是否在事件發生時創建SwingWorker?例如,當一個按鈕被按下?如果是這樣,你應該通過它的構造函數將相關的興趣值傳遞給SwingWorker。我沒有看到你的SwingWorker甚至有一個構造函數。給它一個,並允許傳遞適當的參數,將用於設置對象的字段。


編輯關於你的發佈代碼更改:

public class Worker extends SwingWorker<Void, Void> { 

      MainProgramWindow MPW = new MainProgramWindow(); 

拍攝,你的SwingWorker的內部創造一個全新的GUI程序 - 不這樣做!。您創建的這個對象與正在顯示的對象完全不同。而是按照我的建議傳入構造函數參數。拍攝時,您可以將當前的GUI對象作爲構造函數參數傳入,但不要在SwingWorker中創建新的GUI對象。

例如,

public class Worker extends SwingWorker<Void, Void> { 

    private MainProgramWindow mpw; 

    public Worker(MainProgramWindow mpw) { 
     this.mpw = mpw; 
    } 

編輯2
對於我的意思一個簡單的例子:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class MyGui extends JPanel{ 
    private JTextField textField = new JTextField("Start", 10); 
    private JButton button = new JButton("Press Me"); 

    public MyGui() { 
     textField.setEditable(false); 
     textField.setFocusable(false); 

     button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      MySwingWorker mySwingWorker = new MySwingWorker(MyGui.this); // pass in the GUI 
      mySwingWorker.execute(); 
     } 
     }); 

     add(textField); 
     add(button); 
    } 

    public void setTextFieldText(String text) { 
     textField.setText(text); 
    } 


    private static void createAndShowGui() { 
     JFrame frame = new JFrame("MyGui"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MyGui()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

class MySwingWorker extends SwingWorker<Void, Void> { 
    private static final long SLEEP_TIME = 2 * 1000; 
    private MyGui myGui; 


    public MySwingWorker(MyGui myGui) { 
     this.myGui = myGui; // use the gui to set a field 
    } 


    @Override 
    protected Void doInBackground() throws Exception { 
     Thread.sleep(SLEEP_TIME); 
     return null; 
    } 

    @Override 
    protected void done() { 
     myGui.setTextFieldText("Done!"); // call field's method 
    } 

} 
+0

對不起,我的英文。我語法不好。我在上面編輯我的代碼。 – Lacrymae

+0

@Lacrymae:見編輯回答。你用自己的代碼拍攝自己的腳。 –

+0

謝謝你的例子。我現在嘗試他們並更新你。 – Lacrymae