2011-08-05 13 views
0

ローカルクライアントから取得したイメージを表示するコードがあります。それは、異なる時間に異なる画像を得る。したがって、私はすべての画像を毎回同じラベルに1枚ずつ表示したい。 以下のコードは、オブジェクトが受信されるたびに新しいラベルを生成します。どのように私は私が望むように出力を得るように私は変更することができますか?イメージを同じラベルにリロードする(新規作成なし)

// For each connection it will generate a new label. 

public void received(Connection connection, Object object) { 
    if (object instanceof Picture) { 

     Picture request = (Picture) object; 
     try { 
      System.out.println(request.buff.length); 
      InputStream in = new ByteArrayInputStream(request.buff); 
      BufferedImage image = ImageIO.read(in); 
      JFrame frame = new JFrame("caption"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Dimension dimension = new Dimension(image.getWidth(), image.getHeight()); 

      JLabel label = new JLabel(new ImageIcon(image)); //displays image got from each connection 
      JScrollPane pane = new JScrollPane(label, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
      frame.getContentPane().add(pane); 
      frame.setSize(dimension); 
      frame.setVisible(true); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      System.out.println(ex); 
     } 
    } 
} 
+2

このコードは、毎回新しい 'JFrame'を作成します。 – mre

答えて

0

コードだけでなく、新JLabelを毎回生成するだけでなく、JFrame、新しいJScrollPaneなど新...

は二つの方法initreceiveにコードを区切ります。 initは最初だけ実行され、receiveは画像を更新しますが、すべての「周囲」を作成します。

Basicの例:

JFrame frame; 
JLabel label; 
JScrollPane pane; 
// ... 
public void init() { 
    frame = new JFrame("caption"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Dimension dimension = new Dimension(someDefaultHeight, someDefaultWidth); 
    label = new JLabel(); //displays image got from each connection 
    JScrollPane pane = new JScrollPane(label, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
    frame.getContentPane().add(pane); 
    frame.setSize(dimension); 
    frame.setVisible(true); 
} 


public void received(Connection connection, Object object) { 
    if (object instanceof Picture) { 
     Picture request = (Picture) object; 
     try { 
      System.out.println(request.buff.length); 
      InputStream in = new ByteArrayInputStream(request.buff); 
      BufferedImage image = ImageIO.read(in); 
      Dimension dimension = new Dimension(image.getWidth(), image.getHeight()); 
      label.removeAll(); 
      label.setIcon(new ImageIcon(image)); 
      frame.setSize(dimension); 
      label.revalidate(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      System.out.println(ex); 
     } 
    } 
} 
+1

この例では、Swingのシングルスレッドモデルを考慮していません。 – mre

+0

@mre - 正しいですが、私の意図はできるだけコード内で変更することでした。 – MByD

1

私はあなたが同じJLabelを使用し、同じインスタンス上でsetIconメソッドを呼び出すことができますね。同じJFrameJScrollPaneも再利用する必要があります。 したがって、別のメソッドで初期化し、新しいオブジェクトを受け取ったときにsetIconメソッドを呼び出す必要があります。

関連する問題