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()))); 
    }