Reputation: 141
Basically, there are two different BufferedImage called img_w and img_b1... Once I set my Jframe/label to one of them, it never changes or never repants() to the new Imagebuffered value...
Thanks in advance..
BufferedImage img_w = new BufferedImage(old_width_i, old_height_i, BufferedImage.TYPE_INT_RGB);
BufferedImage img_b1 = new BufferedImage(old_width_i, old_height_i, BufferedImage.TYPE_INT_RGB);
// add data into the img_w and img_b1
JFrame frame=new JFrame();
JLabel label = new JLabel(new ImageIcon(img_w));
frame.getContentPane().add(label, BorderLayout.WEST);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//I am trying to sleep only cause I want to make out if the image is changing or not or basically , to have a rotating illusion...
System.out.println("Hello");
frame.getContentPane().add(new JLabel(new ImageIcon(img_w)), BorderLayout.WEST);
frame.repaint();
label = new JLabel(new ImageIcon(img_b1));
frame.getContentPane().add(label,BorderLayout.WEST); //display the image (works)
label.repaint(); //update the display??
frame.repaint();
frame.getContentPane().repaint();
Upvotes: 0
Views: 488
Reputation: 324207
Your code is not complete so all we can do is guess. Next time post a SSCCE.
I would guess that the problem is that you are adding a component to a visible frame. You didn't invoke revalidate() on the panel so the size of the label remains (0, 0).
However, there is no need to create a new JLabel. Just change the image by invoking the setIcon() method of the existing label and the label will repaint itself. There is no need to invoke repaint() on the frame or any other component.
Upvotes: 2
Reputation: 347332
This...
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Will prevent the UI from dealing with paint requests until it ends. You should never block the EDT.
The example below (is simple) and demonstrates a simple method for moving between pictures manually.
public class FlipPictures {
public static void main(String[] args) {
new FlipPictures();
}
public FlipPictures() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new PicturePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PicturePane extends JPanel {
private JLabel picture;
private File[] pictures;
private int currentPicture = -1;
public PicturePane() {
pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".gif")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp");
}
});
setLayout(new BorderLayout());
picture = new JLabel();
picture.setHorizontalAlignment(JLabel.CENTER);
picture.setVerticalAlignment(JLabel.CENTER);
add(picture);
JButton change = new JButton("Change");
add(change, BorderLayout.SOUTH);
change.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
changePicture();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
protected void changePicture() {
if (pictures != null && pictures.length > 0) {
currentPicture++;
if (currentPicture >= pictures.length) {
currentPicture = 0;
}
try {
// This is a potentionally blocking process and really should be threaded...
picture.setIcon(new ImageIcon(ImageIO.read(pictures[currentPicture])));
picture.setText(null);
} catch (IOException ex) {
ex.printStackTrace();
picture.setText(ex.getMessage());
}
} else {
picture.setText("No Pictures :(");
}
}
}
}
Updated
Or if you prefer to automatically switch between the images
public class FlipPictures {
public static void main(String[] args) {
new FlipPictures();
}
public FlipPictures() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new PicturePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PicturePane extends JPanel {
private JLabel picture;
public PicturePane() {
setLayout(new BorderLayout());
picture = new JLabel();
picture.setHorizontalAlignment(JLabel.CENTER);
picture.setVerticalAlignment(JLabel.CENTER);
add(picture);
BackgroundSwitcher switcher = new BackgroundSwitcher(this);
switcher.execute();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public void setPicture(BufferedImage image) {
picture.setIcon(new ImageIcon(image));
}
}
public class BackgroundSwitcher extends SwingWorker<Void, BufferedImage> {
private File[] pictures;
private int currentPicture = -1;
private PicturePane picturePane;
public BackgroundSwitcher(PicturePane picturePane) {
pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".gif")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp");
}
});
this.picturePane = picturePane;
}
@Override
protected void process(List<BufferedImage> chunks) {
picturePane.setPicture(chunks.get(chunks.size() - 1));
}
@Override
protected Void doInBackground() throws Exception {
if (pictures != null && pictures.length > 0) {
while (true) {
currentPicture++;
if (currentPicture >= pictures.length) {
currentPicture = 0;
}
try {
publish(ImageIO.read(pictures[currentPicture]));
} catch (IOException ex) {
ex.printStackTrace();
}
Thread.sleep(1000);
}
}
return null;
}
}
}
You might like to take a look at Concurrency in Swing
Upvotes: 3