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);         }     }); } 

enter image description here

when click btn1, jcalendar , panel3 invisible panel2 not show

enter image description here

there number of issues can find...

  • borderlayout ever allow single component occupy given position. is, 2 components can not share center 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...

enter image description here

after click...

enter image description here

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

  1. remove calendar component , add panel2 center position when button clicked
  2. preferably, use cardlayout

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -