java - Overlapping panel swing -
i'm trying following layout, jpanels visible exception of panel2 when program starts. when user clicks btn1 jcalendar , panel3 set invisible , panel2 becomes visible. problem i'm having panel2 not showing btn1 clicked. if change borderlayout of panel2 1 not being used (in case west) show when button clicked, aligned on left side , want centered across form.
code:
public class gui extends jframe implements actionlistener, propertychangelistener { private jpanel panel1, panel2, panel3; private com.toedter.calendar.jcalendar calendar; private button btn1, btn2; private jlabel label1, label2; public gui() { init(); } private void init() { //panel1 components panel1 = new jpanel(); btn1 = new jbutton("click me"); panel1.add(btn1); //panel2 components panel2 = new jpanel(); label1 = new jlabel("time:"); label2 = new jlabel("date:"); panel2.add(label1); panel2.add(label2); //jcalendar calendar = new com.toedter.calendar.jcalendar(); //panel3 panel3 = new jpanel(); //add panels jframe add(panel1, borderlayout.north); add(calendar, borderlayout.center); add(panel2, borderlayout.center); //if set west show!! add(panel3, borderlayout.east); //event handling btn1.addactionlistener(this); //hide panel2 panel2.setvisible(false); pack(); } public void actionperformed(actionevent ae) { if(ae.getsource().equals(btn1) { calendar.setvisible(false); panel3.setvisible(false); panel2.setvisible(true); //make panel2 visible panel2.updateui(); revalidate(); repaint(); } } public static void main(string args[]) { javax.swing.swingutilities.invokelater(new runnable() { public void run() { new gui().setvisible(true); } }); }
when click btn1, jcalendar , panel3 invisible panel2 not show
there number of issues can find...
borderlayout
ever allow single component occupy given position. is, 2 components can not sharecenter
position @ same time, regardless if 1 invisible or not.- you should never call
updateui
, used tell ui components , feel has changed should update in response it. - use
revalidate
tell container change has occurred layout should perform new layout process...
before click...
after click...
import java.awt.borderlayout; import java.awt.color; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.beans.propertychangeevent; import java.beans.propertychangelistener; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.border.lineborder; public class gui extends jframe implements actionlistener, propertychangelistener { private jpanel panel1, panel2, panel3; // private com.toedter.calendar.jcalendar calendar; private jpanel calendar; private jbutton btn1, btn2; private jlabel label1, label2; public gui() { setdefaultcloseoperation(exit_on_close); init(); } private void init() { //panel1 components panel1 = new jpanel(); btn1 = new jbutton("click me"); panel1.add(btn1); //panel2 components panel2 = new jpanel(); label1 = new jlabel("time:"); label2 = new jlabel("date:"); panel2.add(label1); panel2.add(label2); //jcalendar calendar = new jpanel();//new com.toedter.calendar.jcalendar(); calendar.setborder(new lineborder(color.red)); calendar.add(new jlabel("calendar")); //panel3 panel3 = new jpanel(); panel3.setborder(new lineborder(color.blue)); panel3.add(new jlabel("panel3")); panel2.setborder(new lineborder(color.green)); //add panels jframe add(panel1, borderlayout.north); add(calendar, borderlayout.west); add(panel2, borderlayout.center); add(panel3, borderlayout.east); //event handling btn1.addactionlistener(this); //hide panel2 panel2.setvisible(false); pack(); } public void actionperformed(actionevent ae) { if (ae.getsource().equals(btn1)) { calendar.setvisible(false); panel3.setvisible(false); panel2.setvisible(true); //make panel2 visible // panel2.updateui(); revalidate(); repaint(); } } public static void main(string args[]) { javax.swing.swingutilities.invokelater(new runnable() { public void run() { new gui().setvisible(true); } }); } @override public void propertychange(propertychangeevent evt) { } }
now, i'm pretty sure won't meet on requirements (as see them)...you have @ least 2 options...
- remove
calendar
component , addpanel2
center
position when button clicked - preferably, use
cardlayout
Comments
Post a Comment