2012-08-14 84 views
0
public class Signal2NoiseRatio 
{ 
    public ImagePlus SingleSNR(ImagePlus imagePlus) throws InterruptedException 
    { 

     new Thread() 
     { 
      @Override public void run() 
      { 
       JFrame imageFrame = new JFrame("ROI"); 
       Container imageFrame_Container = imageFrame.getContentPane(); 
       IIImagePanel imagePanel = new IIImagePanel(); 
       imageFrame_Container.add(imagePanel); 
       imagePanel.setImage(imagePlus.getImage()); 
       imagePanel.getDisplayedImage(); 
       imageFrame.setVisible(true); 
       final SNRSingleImageListener sNRSingleListener = new SNRSingleImageListener(imagePanel); 
       imagePanel.addMouseListener(sNRSingleListener); 
       imagePanel.addMouseMotionListener(sNRSingleListener); 
      } 
     }.start(); 


     new Thread() 
    { 
     @Override public void run() 
     { 

      for (int i = 0; i <= 2000; i++) 
      { 
      System.out.println("schleife "+i); 
        // ask if useractions are done .. 
      } 

      synchronized(Signal2NoiseRatio.this) 
      { 

      Signal2NoiseRatio.this.notifyAll(); 

      } 
     } 
    }.start(); 


     synchronized (this) 
     { 
     this.wait(); 
      // if userinteractions are done, go on 
     } 


     return imagePlusToProcess; 
    } 
} 

第一个new Thread()执行在其中呈现图像的帧。我的目的是在新线程中呈现图像,以等待图像上的某些用户交互。但是代码引导框架变成白色窗口,图像不可见,并且框架不可用。Java并行线程

在第二个线程中,我想在短时间间隔内询问用户操作是否完成。

这不是一个很好的解决方案,但它有可能吗?这里有什么问题?

谢谢你stackoverflow.com!

+0

你'IIImagePanel'类没有线程工作? – martijno 2012-08-14 12:46:29

+1

一个问题是,您无法从除事件分派线程以外的任何线程创建或访问Swing组件。其次,您的'notifyAll()'调用永远不会执行,因为它位于'synchronized'块中。我相信你所寻找的是什么,这些“同步”块都不是必需的。 – 2012-08-14 12:48:41

+0

IIImagePanel工作时没有线程。 – hagem 2012-08-14 13:36:56

回答

0

问题解决了。

该方法的调用者是AWT线程。我为调用者创建了一个新的线程,所以AWT线程没有被阻塞,然后框架和图像可以正确显示。

感谢大家的帮助。

+1

请将此答案标记为已接受。 – Tudor 2012-08-16 07:00:34

1

我可以看到一些问题在这里:

1.如果这个

synchronized (this) 
{ 
    this.wait(); 
    // if userinteractions are done, go on 
} 

是发生在UI线程上,那么你将接收用户输入(或做其他事情),直到阻止它该对象被发信号通知。

2.本部分看起来几乎过于复杂:

new Thread() { 
     @Override 
     public void run() { 

      for (int i = 0; i <= 2000; i++) { 
       System.out.println("schleife " + i); 
       // ask if useractions are done .. 
      } 

      synchronized (Signal2NoiseRatio.this) { 

       Signal2NoiseRatio.this.notifyAll(); 

      } 
     } 
    }.start(); 

    synchronized (this) { 
     this.wait(); 
     // if userinteractions are done, go on 
    } 

只需使用:

Thread t = new Thread() { 
     @Override 
     public void run() { 

      for (int i = 0; i <= 2000; i++) { 
       System.out.println("schleife " + i); 
       // ask if useractions are done .. 
      } 

     } 
    }.start(); 

    t.join(); 

除非你信令比你上面有什么更多。但是,再次,这是多余的,因为开始一个线程只等待它完成没有多大意义...

+0

什么更简单的方法可以实现在方法SingleSNR中使用新的Frame?我无法让它运行。我的目标是在方法返回之前等待用户交互。 – hagem 2012-08-14 18:59:28

+0

@haxenmaxen:所以你想要一个模态框架?因此,它似乎但是它不能访问父框架,直到孩子关闭? – Tudor 2012-08-14 19:55:34

+0

嗯我想你会得到它的一部分。 SingleSNR方法获取要处理的图像,并应返回新处理的图像。因此用户应该在图像上选择一个矩形。所选区域将被计算和处理。对于矩形选择,我需要一个新的帧与图像。该方法应该等待用户选定的矩形并计算后面的内容。毕竟它应该返回新的图像。 – hagem 2012-08-14 20:18:42