2011-08-05 52 views
0

我有一個代碼,將顯示從本地客戶端獲取的圖像。它在不同的時間獲得不同的圖像。因此,我想在每次刷新的同一標籤中逐一顯示所有圖像。 每次接收到對象時,下面的代碼都會生成新的標籤。我如何修改,以便我可以得到我想要的輸出結果?重新加載圖像在相同的標籤(沒有創建任何新的)

// 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等等

獨立的代碼爲兩種方法initreceiveinit將僅在開始時執行,並將創建所有「左右」,而receive將更新圖像。

基本例如:

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方法。

相關問題