Reputation: 3972
I have a code that will show the image got from a local client. It gets different images in different time. Hence , i want to show all the images one by one in the same label refreshing each time. The code below will generate new label each time the object is received. How can i modify so that i will get the output as i want?
// 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);
}
}
}
Upvotes: 0
Views: 1160
Reputation: 137282
The code will not only generate new JLabel
each time, but also new JFrame
, new JScrollPane
etc...
Separate the code into two methods init
and receive
. init
will be executed only at the beginning and will create all the "around" while receive
will update the image.
Basic example:
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);
}
}
}
Upvotes: 0
Reputation: 60195
I guess you can use the same JLabel
and call the setIcon
method on the same instance. You should also reuse the same JFrame
and JScrollPane
.
So, you should initialize them in a separate method and call just the setIcon
method when you receive a new object.
Upvotes: 1