Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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
Javascript 一次显示一个元素_Javascript_Java_Jquery_Javafx - Fatal编程技术网

Javascript 一次显示一个元素

Javascript 一次显示一个元素,javascript,java,jquery,javafx,Javascript,Java,Jquery,Javafx,我有一个javafx应用程序,它对用户上传的文件进行签名。并分别显示这些文件的名称 问题是,要在屏幕上显示文件,它会等待所有文件被签名。所有文件签名后,它会突然显示所有文件 以下gif显示当前状态: 但我想以不同的方式展示它们。因此,每个文件在开始签名过程之前都应该等待显示上一个文件。这就像一次显示一个元素(但不使用setInterval或setTimeout)。换句话说,我想让Java和Javascript相互通信 我在java端使用for循环。在这个for循环中,我调用javascript

我有一个javafx应用程序,它对用户上传的文件进行签名。并分别显示这些文件的名称

问题是,要在屏幕上显示文件,它会等待所有文件被签名。所有文件签名后,它会突然显示所有文件

以下gif显示当前状态:

但我想以不同的方式展示它们。因此,每个文件在开始签名过程之前都应该等待显示上一个文件。这就像一次显示一个元素(但不使用setInterval或setTimeout)。换句话说,我想让Java和Javascript相互通信

我在java端使用for循环。在这个for循环中,我调用javascript函数以在div中显示文件名

Java代码:

List files=new ArrayList();
for(Iterator Iterator=fWrapper.getFiles().Iterator();Iterator.hasNext();){
File unsignedFile=iterator.next();
字符串targetFileStr=targetPath+“/”+unsignedFile.getName();
File signedFile=signer.signUDF(unsignedFile);
添加(targetFileStr);
signedFile.renameTo(新文件(targetFileStr));
Browser.webEngine.executeScript(“已成功签名(“+unsignedFile.getName()+”已签名)。”
}
以及Javascript代码:

函数已成功签名(msg){
$(“#状态文本”).append(“
-”+msg+”); }
有没有人能给我一些关于如何做的建议


提前感谢。

在后台线程中运行签名,并在每次使用FX应用程序线程时更新UI

由于您正在列表中收集文件名,因此我假设您在流程完成时需要该文件名。您可以使用
任务
进行此操作,并在任务完成后使用
onsucceed
处理程序执行代码

Task<List<String>> signingTask = new Task<List<String>>() {
    @Override
    public List<String> call() throws Exception {
        List<String> files = new ArrayList<String>();

        for (File unsignedFile : fWrapper.getFiles()) {
            String targetFileStr = targetPath + "/" + unsignedFile.getName();
            File signedFile = signer.signUDF(unsignedFile);
            files.add(targetFileStr);

            signedFile.renameTo(new File(targetFileStr));

            Platform.runLater(() -> Browser.webEngine.executeScript("signedSuccessfully('" + unsignedFile.getName() + " is signed.')"));
        }
        return files ;
    }
};

signingTask.setOnSucceeded(e -> {
    // this is executed on the FX Application Thread when the task completes successfully
    List<String> signedFiles = signingTask.getValue();
    // do something with signedFiles...
});

signingTask.setOnFailed(e -> {
    Throwable exception = signingTask.getException();
    // this is executed on the FX Application Thread if the task throws an exception
    // inform user something went wrong, etc...
});

Thread t = new Thread(signingTask);
t.start();
Task signingTask=新任务(){
@凌驾
公共列表调用()引发异常{
列表文件=新的ArrayList();
对于(文件unsignedFile:fWrapper.getFiles()){
字符串targetFileStr=targetPath+“/”+unsignedFile.getName();
File signedFile=signer.signUDF(unsignedFile);
添加(targetFileStr);
signedFile.renameTo(新文件(targetFileStr));
Platform.runLater(()->Browser.webEngine.executeScript(“signedSuccessfully(“+unsignedFile.getName()+”已签名”)));
}
归还文件;
}
};
signingTask.SetonSucceed(e->{
//当任务成功完成时,这将在FX应用程序线程上执行
List signedFiles=signingTask.getValue();
//对签名文件执行某些操作。。。
});
signingTask.setOnFailed(e->{
Throwable exception=signingTask.getException();
//如果任务引发异常,则在FX应用程序线程上执行此操作
//通知用户出了什么问题,等等。。。
});
线程t=新线程(签名任务);
t、 start();

在后台线程中运行签名,每次在FX应用程序线程上使用

由于您正在列表中收集文件名,因此我假设您在流程完成时需要该文件名。您可以使用
任务
进行此操作,并在任务完成后使用
onsucceed
处理程序执行代码

Task<List<String>> signingTask = new Task<List<String>>() {
    @Override
    public List<String> call() throws Exception {
        List<String> files = new ArrayList<String>();

        for (File unsignedFile : fWrapper.getFiles()) {
            String targetFileStr = targetPath + "/" + unsignedFile.getName();
            File signedFile = signer.signUDF(unsignedFile);
            files.add(targetFileStr);

            signedFile.renameTo(new File(targetFileStr));

            Platform.runLater(() -> Browser.webEngine.executeScript("signedSuccessfully('" + unsignedFile.getName() + " is signed.')"));
        }
        return files ;
    }
};

signingTask.setOnSucceeded(e -> {
    // this is executed on the FX Application Thread when the task completes successfully
    List<String> signedFiles = signingTask.getValue();
    // do something with signedFiles...
});

signingTask.setOnFailed(e -> {
    Throwable exception = signingTask.getException();
    // this is executed on the FX Application Thread if the task throws an exception
    // inform user something went wrong, etc...
});

Thread t = new Thread(signingTask);
t.start();
Task signingTask=新任务(){
@凌驾
公共列表调用()引发异常{
列表文件=新的ArrayList();
对于(文件unsignedFile:fWrapper.getFiles()){
字符串targetFileStr=targetPath+“/”+unsignedFile.getName();
File signedFile=signer.signUDF(unsignedFile);
添加(targetFileStr);
signedFile.renameTo(新文件(targetFileStr));
Platform.runLater(()->Browser.webEngine.executeScript(“signedSuccessfully(“+unsignedFile.getName()+”已签名”)));
}
归还文件;
}
};
signingTask.SetonSucceed(e->{
//当任务成功完成时,这将在FX应用程序线程上执行
List signedFiles=signingTask.getValue();
//对签名文件执行某些操作。。。
});
signingTask.setOnFailed(e->{
Throwable exception=signingTask.getException();
//如果任务引发异常,则在FX应用程序线程上执行此操作
//通知用户出了什么问题,等等。。。
});
线程t=新线程(签名任务);
t、 start();

我猜您发布的代码是在FX应用程序线程上执行的。在后台线程中执行循环,并在
Platform.runLater(…)中包装对
executeScript(…)的调用。
。谢谢你的评论,詹姆斯,事实上我在javafx中是一个贪婪的人。我猜我没有使用线程,我猜我的代码没有在FX应用程序线程上执行。你能更详细地描述一下吗?或者你有什么其他想法吗?我猜你发布的代码是在FX应用程序线程.Exe上执行的在后台线程中执行循环,并将对
executeScript(…)
的调用包装到
Platform.runLater(…)
。谢谢你的评论,詹姆斯,事实上我在javafx中是一个贪婪的人。我猜我没有使用线程,我猜我的代码没有在FX应用程序线程上执行。你能更详细地描述一下吗?或者你有什么其他想法吗?谢谢你的回答,詹姆斯,但我得到了你的答案“java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=thread-10“有了这个。我已经尝试了很多方法来解决它,但我无法实现。你有什么想法来解决这个问题吗?谢谢。哪一行引发了这个异常?我解决了它。这个异常是从另一行发生的。它与你的代码无关。谢谢你的时间。谢谢你的回答,詹姆斯,但我得到了答案。”“java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=thread-10”这样说。我已经尝试了很多方法来解决这个问题,但我可以