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...

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...

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
Post a Comment