java - Making a slideshow program -


i trying make slideshow program. want next slide appear when click (there 2 slides not, add more once errors r sorted out). code compiles fine. when click, nothing happens. possibly go wrong?

package project;  import java.awt.borderlayout; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel;  public class frame extends jframe{  frame() {     setlayout(new borderlayout());     imageicon slide = new imageicon("e:\\books\\computer\\java\\introduction java programming\\exercise9e\\image\\slide0.jpg");     jlabel slideslabel = new jlabel(slide);     add(slideslabel,borderlayout.center);     slideslabel.addmouselistener(new clicklistener()); }  public void nextslide() {     imageicon slide = new imageicon("e:\\books\\computer\\java\\introduction java programming\\exercise9e\\image\\slide1.jpg");     jlabel slideslabel = new jlabel(slide);     add(slideslabel,borderlayout.center);     system.out.println("x"); }  public static void main(string args[]) {     frame frame = new frame();     frame.setsize(800,600);     frame.setlocationrelativeto(null);     frame.setdefaultcloseoperation(exit_on_close);     frame.setvisible(true); }  public class clicklistener extends mouseadapter {     @override     public void mouseclicked(mouseevent e) {         nextslide();     } }  } 

so, "main" problem borderlayout manage single component within of 5 available locations manages.

adding component position tends cause issues, component first added won't displayed, or in case, remain , interfere new component

"a" solution re-use same jlabel each slide, supply new value icon property (or in example, text property)

import java.awt.borderlayout; import java.awt.eventqueue; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class frame extends jframe {      private jlabel slideslabel = new jlabel("apple");     public frame() {         setlayout(new borderlayout());         add(slideslabel, borderlayout.center);         slideslabel.addmouselistener(new clicklistener());     }      public void nextslide() {         slideslabel.settext("banana");     }      public static void main(string args[]) {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                     ex.printstacktrace();                 }                  frame frame = new frame();                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class clicklistener extends mouseadapter {          @override         public void mouseclicked(mouseevent e) {             nextslide();         }     }  } 

this approach allow place each icon array , have counter determines slide current, when click next slide, increment counter, next value array , apply label

a better (and more appropriate) solution use cardlayout, see how use cardlayout more details

with icons...

slideshow

import java.awt.borderlayout; import java.awt.eventqueue; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.io.file; import java.io.ioexception; import javax.imageio.imageio; import javax.swing.icon; import javax.swing.imageicon; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class frame extends jframe {      private jlabel slideslabel = new jlabel();     private icon[] icons;     private int currentslide = -1;      public frame() {         try {             // personally, i'd use file#listfiles list             // images in directory, might consider             // using our initiative...             icons = new icon[]{                 new imageicon(imageio.read(new file("..."))),                 new imageicon(imageio.read(new file("..."))),                 new imageicon(imageio.read(new file("...")))             };             slideslabel.setverticalalignment(jlabel.center);             slideslabel.sethorizontalalignment(jlabel.center);             setlayout(new borderlayout());             add(slideslabel, borderlayout.center);             slideslabel.addmouselistener(new clicklistener());             nextslide();         } catch (ioexception exp) {             exp.printstacktrace();         }     }      public void nextslide() {         if (currentslide < icons.length - 1) {             currentslide++;             slideslabel.seticon(icons[currentslide]);         }     }      public static void main(string args[]) {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                     ex.printstacktrace();                 }                  frame frame = new frame();                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class clicklistener extends mouseadapter {          @override         public void mouseclicked(mouseevent e) {             nextslide();         }     }  } 

why adding components borderlayout bad...

badlayout

all did when nextslide called, create new jlabel assign next icon , add frame (which using borderlayout) , re-sized frame. because labels transparent, remain visible...

this why shouldn't add new components borderlayout, but, in case, update properties of existing jlabel meet changing needs.


Comments