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()に、その中に画像を表示するフレームを実行します。私の意図は、画像に対するユーザーの操作を待つために、新しいスレッドで画像を提示することでした。しかし、コードはフレームを白いウィンドウに導き、画像は表示されず、フレームは使用できません。

2 番目のスレッドでは、ユーザーの操作が完了したかどうかを短い間隔で尋ねます。

それは本当に良い解決策ではありませんが、可能ですか?ここで何が問題なのですか?

スタックオーバーフローありがとう!

4

2 に答える 2

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();

あなたが上に持っていた以上のものを伝えていない限り。しかし、繰り返しますが、これは冗長です。終了するのを待つためだけにスレッドを開始するのはあまり意味がありません...

于 2012-08-14T12:46:49.337 に答える
0

問題が解決しました。

メソッドの呼び出し元は AWT スレッドでした。インボーカー用に新しいスレッドを作成したため、AWT スレッドはブロックされず、フレームと画像は正しく表示されました。

ご協力ありがとうございました。

于 2012-08-15T11:18:36.073 に答える