Java – the right way to update images using jlabels
I'm creating a GUI, and it's a fairly new swing and AWT I'm trying to create a GUI, set the background as an image at startup, and then use this method to create various slides I've tried, and I haven't attached it to the code, so I can modify and / or new concepts at the same time
Editor (September 15, 2013): I have a problem in the slide and can't seem to make it work
This is my current code
public class MainFrame extends JFrame{ JLabel backgroundL = null; private JLabel bakckgroundL; BufferedImage backimg; Boolean busy; double width; double height; public MainFrame() throws IOException { initMainframe(); } public void initMainframe() throws IOException { //misc setup code,loads a default jpg as background setTitle("Pemin's Aura"); busy = true; String backgroundDir = "resources/frame/background.jpg"; backimg = ImageIO.read(new File(backgroundDir)); backgroundL = new JLabel(new ImageIcon(backimg)); setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); refreshframe(); setVisible(true); busy = false; } public void adjSize() { // the attempted start of a fullscreen mode GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this); width = this.getWidth(); height = this.getHeight(); setVisible(true); } public void setmastheadText() {//unfinished code busy = true; busy = false; } public void setbackground() { add(backgroundL); } public void refreshframe() { //should refresh image? setSize(2049,2049); setSize(2048,2048); } public void loadingscreen() throws IOException,InterruptedException { //this is the code in question that is faulty. if (busy == false) { busy = true; String backgroundDir1 = "resources/frame/background.jpg"; String backgroundDir2 = "resources/frame/scr1.jpg"; String backgroundDir3 = "resources/frame/scr2.jpg"; BufferedImage backimg1 = ImageIO.read(new File(backgroundDir1)); BufferedImage backimg2 = ImageIO.read(new File(backgroundDir2)); BufferedImage backimg3 = ImageIO.read(new File(backgroundDir3)); backgroundL = new JLabel(new ImageIcon(backimg1)); Thread.sleep(2000); setbackground(); setVisible(true); backgroundL = new JLabel(new ImageIcon(backimg2)); setbackground(); setVisible(true); Thread.sleep(2000); bakckgroundL = new JLabel(new ImageIcon(backimg3)); setbackground(); setVisible(true); if(backimg != null) { backgroundL = new JLabel(new ImageIcon(backimg));; } } busy = false; }//end of loading screen
Solution
For a working example of displaying images using the swing based timer, see ImageViewer
See also how to use swing timers
Although I am here, another (more beautiful) example of animated images It uses the Mercator land quality map The image can be tiled horizontally, so you can scroll left / right as needed
import java.awt.*; import java.awt.event.*; import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import javax.swing.*; import java.net.URL; import javax.imageio.ImageIO; public class WorldView { public static void main(String[] args) throws Exception { URL url = new URL("http://i.stack.imgur.com/P59NF.png"); final BufferedImage bi = ImageIO.read(url); Runnable r = new Runnable() { @Override public void run() { int width = 640; int height = 316; Graphics2D g = bi.createGraphics(); float[] floats = new float[]{0f,.4f,.55f,1f}; Color[] colors = new Color[]{ new Color(20,20,0),new Color(0,10,41),207),230),}; final LinearGradientPaint gp2 = new LinearGradientPaint( new Point2D.Double(320f,0f),new Point2D.Double(0f,floats,colors,MultipleGradientPaint.CycleMethod.REFLECT); final BufferedImage canvas = new BufferedImage( bi.getWidth(),bi.getHeight() + 60,BufferedImage.TYPE_INT_RGB); final JLabel animationLabel = new JLabel(new ImageIcon(canvas)); ActionListener animator = new ActionListener() { int x = 0; int y = 30; @Override public void actionPerformed(ActionEvent e) { Graphics2D g = canvas.createGraphics(); g.setColor(new Color(55,75,125)); g.fillRect(0,canvas.getWidth(),canvas.getHeight()); int offset = (x % bi.getWidth()); g.drawImage(bi,offset,y,null); g.drawImage(bi,offset - bi.getWidth(),null); g.setPaint(gp2); g.fillRect(0,canvas.getHeight()); g.dispose(); animationLabel.repaint(); x++; } }; Timer timer = new Timer(40,animator); timer.start(); JOptionPane.showMessageDialog(null,animationLabel); timer.stop(); } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency SwingUtilities.invokelater(r); } }
This is a version of the image with the equator added (it is 44 pixels south of the image center)