2017-11-21 7 views
0

こんにちは、私はクライアントから画像を受け取ってループに表示しています。データは正しく受信されましたが、ループが終了すると最後に受信した画像のみが表示されますImageViewはループ内の最後の画像のみを表示します

これはスレッド内のメインコントローラではありません。ここでは....

を私はそれがデータを受信して​​いますいただきました!間違っていると知っていないと、それはすべての繰り返しで更新する必要がありますコードです:ここ

@FXML ImageView currentframe; 
public void run() 
{ 
     System.out.println("hi controller"); 
     System.out.println("creating socket"); 
     DatagramSocket serverSocket=null; 
     try { 
      serverSocket = new DatagramSocket(1001); 
     } catch (SocketException ex) { 
      Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("created socket"); 

     byte[] receiveData = new byte[50000]; 

     //byte[] sendData = new byte[1024]; 
     //BufferedImage img = null; 
     //Image image = null; 

     int counter = 0; 

     while(counter<20){ 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      try { 
       serverSocket.receive(receivePacket); 
      } catch (IOException ex) { 
       Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      //System.out.println("packetreceive"); 
      BufferedImage img = null; 

      try { 
       img = ImageIO.read(new ByteArrayInputStream(receivePacket.getData())); 
      } catch (IOException ex) { 
       Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      //System.out.println("packetreceive1"); 
      System.out.println("received packet length "+receivePacket.getLength()); 

      Image image= SwingFXUtils.toFXImage(img, null); 

      Image tempImg = image; 

      Platform.runLater(() -> currentframe.setImage(tempImg)); 


      /* 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex); 
      }*/ 

      //currentframe.setImage(image); 
      //threadclass t = new threadclass(currentframe, image); 
      //t.start(); 

      //Platform.runLater(null); 

      counter++; 
      System.out.println("IMAGE SET ON FRAME..."); 
     } 
     //System.out.println("ssdcd"); 
     // currentframe.setImage(image); 
     //System.out.println("last packet "); 
} 

は私は、コントローラ内のスレッドを始めている方法です。

単に現在で run()メソッドを呼び出します

t.run(); 

を呼び出す

@FXML 
public void btn(ActionEvent event) throws IOException, InterruptedException 
{ 
     threadclass t = new threadclass(currentframe); 
     t.run(); 
    } 
+0

あなたはバックグラウンドスレッドでこれを実行していないようですね。どのようにスレッドを開始しているかを示します。 –

+0

ボタンイベントを使用してスレッドを開始しました。コードを追加しました。 –

+0

うん、 't.run()'? –

答えて

1

スレッド(おそらくFXアプリケーションスレッドです)。新しいスレッドを開始するには、threadclass(原文のまま)と仮定し

t.start(); 

を呼び出す必要がThreadのサブクラスです。

関連する問題