0

我正在使用線程來解決GUI凍結的問題。但與線程我面臨一個問題,我無法通過運行方法的參數或甚至在構造函數的幫助下傳遞格式的報告,我無法做到這一點.....JavaFX線程問題

public class BirtReportExportCon implements Runnable { 

    @FXML 
    Button exportButton; 

    @FXML 
    CheckBox pdfCheckBox; 

    @FXML 
    CheckBox xlsCheckBox; 

    @FXML 
    CheckBox docCheckBox; 

    @FXML 
    CheckBox mailCheckBox; 

    public String fileFormat; 

允許檢查桂單個複選框

public void eventCheckBoxPdf() { 
     if (pdfCheckBox.isSelected() == true) { 
      xlsCheckBox.setSelected(false); 
      docCheckBox.setSelected(false); 
     } 
    } 

    public void eventCheckBoxXls() { 
     if (xlsCheckBox.isSelected() == true) { 
      pdfCheckBox.setSelected(false); 
      docCheckBox.setSelected(false); 
     } 
    } 

    public void eventCheckBoxDoc() { 
     if (docCheckBox.isSelected() == true) { 
      pdfCheckBox.setSelected(false); 
      xlsCheckBox.setSelected(false); 
     } 
    } 

提供救世FILEFORMAT

public void onButtonClick() throws EngineException { 

     if (docCheckBox.isSelected() == true) { 
      fileFormat = "docx"; // I WANT THIS FILE FORMAT IN MY RUN METHOD 
      Runnable r = new BirtReportExportCon(); 
      new Thread(r).start(); 

     } 

     else if (pdfCheckBox.isSelected() == true) { 
      fileFormat = "pdf"; 
      Runnable r = new BirtReportExportCon(); 
      new Thread(r).start(); 
     } 

     else if (xlsCheckBox.isSelected() == true) { 
      fileFormat = "xls"; 
      Runnable r = new BirtReportExportCon(); 
      new Thread(r).start(); 
     } 
    } 

運行方法

public void run() 
    { 
     try 
     { 
      exportFile(fileFormat); // HERE I WANT THAT SO I CAN ABLE TO CREATE REPORT OF REQUIRED FORMAT 
     } 
     catch (EngineException e) { 
      e.printStackTrace(); 
     } 
    } 

保存報表和打開報表

public void exportFile(String fileFormat) throws EngineException { 

     String output = "output path"; 
     String reportDesignFilePath = "report path"; 


     try { 
      EngineConfig configure = new EngineConfig(); 
      Platform.startup(configure); 
      IReportEngineFactory reportEngineFactory = (IReportEngineFactory) Platform 
        .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); 
      IReportEngine engine = reportEngineFactory.createReportEngine(configure); 
      engine.changeLogLevel(Level.WARNING); 
      IReportRunnable runnable = engine.openReportDesign(reportDesignFilePath); 
      IRunAndRenderTask task = engine.createRunAndRenderTask(runnable); 
      IRenderOption option = new PDFRenderOption(); 
      option.setOutputFormat(fileFormat); 
      option.setOutputFileName(output + fileFormat); 
      task.setRenderOption(option); 
      task.run(); 
      task.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     // Open Created File 
     File fileOpen = new File(output + fileFormat); 
     if (fileOpen.exists()) { 
      if (Desktop.isDesktopSupported()) { 
       try { 
        Desktop desktop = Desktop.getDesktop(); 
        desktop.open(fileOpen); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

回答

0

我有一個類似的問題是這樣的。我認爲問題出在fileOpening階段。您使用的Desktop類來自java.awt包。當您使用Desktop類時,JAVAFX線程被用戶評論爲阻止在此答案底部給出的鏈接。但用戶聲譽較低(僅11),所以我們不能依靠他。

爲了讓您的應用程序解凍,您將不得不創建一個新的線程。 這是我的代碼的一部分,我在我的應用程序中使用,此代碼完美工作。我還在我的應用程序的github問題中提到了一個鏈接,在這裏我說明了凍結問題,與您的問題類似。該問題是在2天前創建的。

@FXML 
    void openWithAction(ActionEvent event) { 
     boolean flag = false; 
     Task task = new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 
       try { 
        Desktop.getDesktop().open(new File(fileModel.getFileLocation())); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }; 
     new Thread(task).start(); 
    } 

Github的問題鏈接: https://github.com/karanpant/SearchEverything/issues/3

我也建議你使用JavaFX的通過提供併發性。 這是另一個SO帖子鏈接。希望這可以幫助。 JavaFX Freeze on Desktop.open(file), Desktop.browse(uri)

編輯:如果我不明白你的問題,我很抱歉。您的問題是關於應用程序凍結或關於無法傳遞參數或者因爲應用程序凍結而無法傳遞參數的問題。

+0

謝謝@卡爾納 – Demo

+0

有幫助嗎?如果 – karna

+0

是的,並且實際的問題是我無法在我的線程運行方法中傳遞參數。但是現在我已經解決了這個問題,我期待優化代碼 – Demo

0

嘗試是這樣的:

if (docCheckBox.isSelected() == true) { 
    BirtReportExportCon r = new BirtReportExportCon(); 
    r.fileFormat = "docx"; // I WANT THIS FILE FORMAT IN MY RUN METHOD 
    new Thread(r).start(); 
} 
+0

錯誤:FILEFORMAT不能得到解決或者是不是我在this.Any幫助被困現場 – Demo

+0

親切響應,將不勝感激。 – Demo

+0

編輯答案。 –

0

您應該在Swing線程上運行此代碼,而不是從Java FX線程調用它。像下面這樣:

@FXML 
    void openWithAction(ActionEvent event) { 
     SwingUtilities.invokeLater(() -> Desktop.getDesktop(). 
              open(new File(fileModel. 
                getFileLocation()))); 
    }