Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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
我的java swing应用程序jcomponents赢得了';是否在计算完成后才重新喷漆?_Java_Swing_Jbutton_Imageicon_Invokelater - Fatal编程技术网

我的java swing应用程序jcomponents赢得了';是否在计算完成后才重新喷漆?

我的java swing应用程序jcomponents赢得了';是否在计算完成后才重新喷漆?,java,swing,jbutton,imageicon,invokelater,Java,Swing,Jbutton,Imageicon,Invokelater,我有一个语音识别系统,这是监听(按钮)功能 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: jButton1.setIcon( loading_icon ); microphone.startRecording() j

我有一个语音识别系统,这是
监听(按钮)
功能

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       

    // TODO add your handling code here:

    jButton1.setIcon( loading_icon );
    microphone.startRecording()
    jButton1.setIcon( speak_icon );

    System.out.println("Start speaking. Press Ctrl-C to quit.\n");

    result = recognizer.recognize();
    if (result != null) {
         String bestfinalnofiller = result.getBestFinalResultNoFiller();
         String hypothesis = result.getBestPronunciationResult();
         String getresult = result.getBestResultNoFiller();

         System.out.println("You said: " + bestfinalnofiller + '\n');
         System.out.println("You said: " + hypothesis + '\n');
         System.out.println("You said: " + getresult + '\n');

    } else {

    } 
}      
我的结果如下: 按钮图标保持不变,并在工作完成后更改 系统在工作进行时打印字符串
“开始说话…”

recognizer.recognize()
函数:

public Result recognize(String referenceText) throws IllegalStateException {

    Result result = null;
    checkState(State.READY);
    try {
        setState(State.RECOGNIZING);
        result = decoder.decode(referenceText);
    } finally {
        setState(State.READY);
    }
    return result;

}
我试图补充:

SwingUtilities.invokeLater

但是不起作用,请帮助我,我想在计算时更改按钮的图标图像…

很可能是
识别器。recognize()
是一种阻塞方法,即在完成之前,它不会返回

这意味着,在该方法返回之前,您将阻止事件调度线程,该线程负责处理绘制请求

这意味着,在方法返回之前,无法绘制或更新(或响应)任何内容

一个简单的解决方案是使用
SwinWorker
,它允许您设置后台进程以执行阻塞调用,但也提供了许多方法通过EDT同步UI的任何更新


仔细看一看,了解更多细节

但是为什么swing fix不在转到另一行之前绘制未绘制的图形,除了“SwingWorker”之外,还有什么解决方案吗。谢谢again@malekh因为Swing是一个单线程框架,就像大多数GUI框架一样
actionPerformed
在EDT的上下文中被调用,这意味着在该方法存在之前,它无法处理下一系列事件(包括绘制事件)。这就是它的工作方式。如果在编辑上下文中调用“actionPerformed”,是否仍可以使用“鼠标单击”功能或“发布时”功能。不,所有事件都是在事件调度线程的上下文中传递的…这就是重点。这确保事件以适当的顺序处理,并且不考虑潜在的争用条件或其他线程问题。最好的选择,仍然是
SwingWorker
是的,你打赌是真的,我尝试了所有可能的方法,但都没有成功,但有了“SwingWorker”,问题就解决了!