Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaFX场景生成器中执行大任务而不冻结_Java_Multithreading_Javafx_Netbeans 8_Scenebuilder - Fatal编程技术网

在JavaFX场景生成器中执行大任务而不冻结

在JavaFX场景生成器中执行大任务而不冻结,java,multithreading,javafx,netbeans-8,scenebuilder,Java,Multithreading,Javafx,Netbeans 8,Scenebuilder,我对JavaFX非常陌生。我正在使用JavaFX和带有Netbeans IDE的场景生成器开发一个桌面应用程序 这是我的应用程序界面(我没有那么好的名声来展示屏幕截图) 一个名为“单击此处启用文本框”的复选框(位于复选框右侧) 一个文本框(默认情况下应禁用,如果用户单击/选中复选框,则应具有写入选项;即启用) 一个按钮名为“完成大任务”-此按钮执行主要任务,此任务相当长。(ssh连接完成,脚本从Java类调用到远程机器,该脚本调用另外两个SCRPT,最后完成,所有进程的日志记录在名为output

我对JavaFX非常陌生。我正在使用JavaFX和带有Netbeans IDE的场景生成器开发一个桌面应用程序

这是我的应用程序界面(我没有那么好的名声来展示屏幕截图)

  • 一个名为“单击此处启用文本框”的复选框(位于复选框右侧)

  • 一个文本框(默认情况下应禁用,如果用户单击/选中复选框,则应具有写入选项;即启用)

  • 一个按钮名为“完成大任务”-此按钮执行主要任务,此任务相当长。(ssh连接完成,脚本从Java类调用到远程机器,该脚本调用另外两个SCRPT,最后完成,所有进程的日志记录在名为output.log的文件中)

  • 另一个名为“show logs”的按钮(目的是显示output.log live[在执行时写入]),后跟一个大文本字段(应该在其中显示日志)

  • 和一个进度条(其中将显示从script1到Scriptn的调用进度)

  • 下面是我的FXMLDocumentController.java类:

    @FXML
    Button btnDotheBigtask;
    
    @FXML 
    Button btnShowLogs;
    
    @FXML 
    TextArea txtShowLogs;
    
    @FXML 
    TextField txtMyText;
    
    @FXML 
    CheckBox clickHeretoEnableTextBox;
    
    
    @FXML
    public void btnDotheBigtaskClick(ActionEvent event) throws IOException {        
        //CreateRelease create = new CreateRelease();
        MyClassImpl m = new MyClassImpl();
        m.doTheWork();
    
    }
    
    @FXML
    public void btnShowLogs(ActionEvent event) throws IOException {        
    
    
    }
    
     @FXML
    public void clickHeretoEnableTextBox(ActionEvent event) throws IOException {
    
    }
    
    @FXML
    public void txtAreaShowLogs(ActionEvent event) throws IOException {
    
    }
    
    @FXML
    public void txtMyText(ActionEvent event) throws IOException {
    
    }
    
    MyClassImpl.java来执行主任务[我已经使用SSHExecute 1.0 jar来建立ssh连接]

            ConnBean cb = new ConnBean("RemoteServer", "user","password");
            // Put the ConnBean instance as parameter for SSHExec static method getInstance(ConnBean) to retrieve a singleton SSHExec instance
            ssh = SSHExec.getInstance(cb);          
            //Connect to server
            ssh.connect();
    
           CustomTask sampleTask = new ExecCommand("/usr/Test/myscript.sh");
    
    
            //Execution of main taks
            Result rs = ssh.exec(sampleTask);
    
    我想做的是:

  • 默认情况下,文本框应取消锁定,在单击复选框时应启用该复选框
  • 单击B和BigTaskClick按钮时,UI不应冻结,当我单击此按钮时,标签中应显示一条消息,如“工作已开始…” (稍后我将创建)完成整个任务后,标签值应更新为“工作完成”
  • 单击“显示日志”按钮,日志应显示在文本字段中。(此时UI不应冻结)
  • 基本上,我已经完成了很多任务来实现这一点,并检查我失败的地方

  • 大任务执行顺利(因为我使用了java标准线程),但当我单击ShowLog按钮UI Get freeze时,未能显示日志。(在showLogs上,我已阅读日志文件并尝试打印文本feild)

  • 我未能在控制器类中存在的标签中显示/设置来自不同类(MyClassImpl)的已完成/启动的工作消息


  • 有人能帮我用概念或代码来完成这个任务吗(代码会更容易理解)

    我建议您在后台线程中运行长时间运行的任务,并仅在完成时显示结果。我不知道如何在MyClassImpl.java中设置控制器中的标签中的文本,因为我的线程将在MyClassImpl.java中完成另一件事2。如果我加入线程,UI将冻结,直到进程完成。所以不要加入,这会破坏拥有后台线程的目的。通过向GUI线程添加任务来更新标签,可以设置标签中的文本。下面是一个很好的帮助示例,但是如何从MyClassImpl.java设置标签文本,因为我不知道在MyClassImpl.java中运行此任务的执行时间。关于此问题有多个问题/答案(例如)。