2012-08-14 114 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