java - JComponents changing positions for a frame if swing calls validate() in a Jpanel -


i have jpanel have components moveable.

my problem if use action in panel locations of components in whole panel changing theire position top mid frame changing theire positions. debugged , know coming validate(). if use validate() manually happens without actions, too.

so here code components used in panel:

import java.awt.color; import java.awt.component; import java.awt.cursor; import java.awt.dimension; import java.awt.font; import java.awt.graphics; import java.awt.point; import java.awt.systemcolor; import java.awt.event.actionevent; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.util.arraylist;  import javax.swing.abstractaction; import javax.swing.imageicon; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jpopupmenu; import javax.swing.swingconstants; import javax.swing.uimanager;  import org.pentaho.reporting.engine.classic.core.datafactory; import org.pentaho.reporting.engine.classic.core.designtime.datasourceplugin;  import com.inform_ac.utils.misc.gui.resizer.componentresizer;    /**  * abutton java-swing component integrated functional buttons.  */ public class abutton extends jpanel {  /**  * serialversionuid: 111111111l  */ protected static final long serialversionuid = 111111111l;  /**  * standard font displaying text.  */ protected font standardfont = new font("dialog", font.plain, 12);  /**  * defining functional jbuttons delete , edit abutton.  */ protected adeletebutton delbtn = new adeletebutton(this); protected jbutton editbtn = new jbutton(); protected string[] editoptionnames = { "connect", "deconnect", "edit" }; protected jpopupmenu popupmenu = new jpopupmenu(); protected dimension mindimension = new dimension(120,120); protected point location = new point();  protected datafactory datafactory; protected datasourceplugin datasourceplugin;   /**  * mode: 0 - moving       *       1 - connecting  */ protected int mode = 0;  /**  * defining label displaying ok or error images.  */ protected jlabel lblicon = new jlabel();  protected final jlabel lblinfo1 = new jlabel(); protected final jlabel lblinfo2 = new jlabel(); protected final jlabel lblinfo3 = new jlabel();  public final jbutton connectbtn_right = new jbutton(); public final jbutton connectbtn_left = new jbutton();  protected abutton parent; protected arraylist<abutton> children = new arraylist<abutton>();  /**  * identifier  */ protected int id = 0;  /**  * constructor given start coordinates.  *   * @param x  *            - coordinate  * @param y  *            - coordinate  */ public abutton(int x, int y, int index) {     this.id = index;     location = new point(x,y);     setbounds(location.x, location.y, mindimension.width, mindimension.height);     init();  }  /**  * private method initialize main components.  */ private void init() {     initpnl();     initbtns();     setvisible(true);     setfocusable(true); }  /**  * private method initialize main panel.  */ private void initpnl() {     setbackground(uimanager.getcolor("internalframe.activetitlebackground"));     setcursor(cursor.getpredefinedcursor(cursor.move_cursor));     setpreferredsize(mindimension);     setborder(uimanager.getborder("checkbox.border"));     setfont(standardfont);     setlayout(null); }  /**  * private method initialize functional {@linkplain jbutton}.  */ private void initbtns() {     initeditbtn();     initdelbtn();     initiconpnl();     initconnectorbtns(); }  /**  * private method initialize delete button. method have refresh  * size of abutton set button on top right corner of  * abutton.  */ private void initdelbtn() {     delbtn.setbounds(getwidth() - 18 - 2, 2, 18, 18);     delbtn.setfont(standardfont);     delbtn.setbackground(null);     delbtn.setborderpainted(false);     delbtn.setborder(null);     delbtn.setcursor(cursor.getpredefinedcursor(cursor.hand_cursor));     delbtn.setpreferredsize(new dimension(16, 16));     delbtn.setminimumsize(new dimension(12, 12));     delbtn.setmaximumsize(new dimension(20, 20));     delbtn.seticon(new imageicon(abutton.class             .getresource("/javax/swing/plaf/metal/icons/ocean/close.gif")));     add(delbtn); }  /**  * private method initialize edit button.  */ private void initeditbtn() {     initpopupmenu();     initmouselistener();     editbtn.setbounds(2,2,21,21);     editbtn.setfont(standardfont);     editbtn.setborder(null);     editbtn.setborderpainted(false);     editbtn.setbackground(uimanager             .getcolor("internalframe.activetitlegradient"));     editbtn.setcursor(cursor.getpredefinedcursor(cursor.hand_cursor));     editbtn.setalignmentx(component.center_alignment);     editbtn.setpreferredsize(new dimension(21, 21));     editbtn.setminimumsize(new dimension(18, 18));     editbtn.setmaximumsize(new dimension(25, 25));     editbtn.seticon(new imageicon("c:\\users\\akaradag\\pictures\\javaicon\\icon_bearbeiten.gif")); add(editbtn); }  protected void initpopupmenu(){     for(int = 0; < editoptionnames.length; i++) {         popupmenu.add(new abstractaction(editoptionnames[i]) {              private static final long serialversionuid = 5550466652812249477l;              @override             public void actionperformed(actionevent e) {                 if (e.getactioncommand().equals("connect")) {                     if (mode == 1) {                         mode = 0;                         showconnectors();                     } else {                         mode = 1;                         showconnectors();                     }                 } else if (e.getactioncommand().equals("deconnect")) {                     resetconnections();                 }                 else if(e.getactioncommand().equals("edit")) {                  }             }          });     } }   protected void initmouselistener() {     editbtn.addmouselistener(new mouseadapter() {         @override         public void mouseclicked(mouseevent e) {             popupmenu.show(e.getcomponent(), e.getx(), e.gety());         }     }); }  /**  * private method display or not display connector buttons  */ public void showconnectors() {     boolean connect = false;     if (mode == 1) {         connect = true;     }     connectbtn_left.setvisible(connect);     connectbtn_right.setvisible(connect); }  /**  * private method initialize connector buttons  */ private void initconnectorbtns() {     connectbtn_right.setcursor(cursor             .getpredefinedcursor(cursor.default_cursor));     connectbtn_right.setvisible(false);     connectbtn_right.setpreferredsize(new dimension(15, 15));     connectbtn_right.setminimumsize(new dimension(12, 12));     connectbtn_right.setmaximumsize(new dimension(15, 15));     connectbtn_right.setfont(new font("dialog", font.plain, 12));     connectbtn_right.setborderpainted(false);     connectbtn_right.setborder(null);     connectbtn_right.setbackground(systemcolor.activecaption);     connectbtn_right             .setbounds(getwidth() - 16, getheight() / 2 - 5, 15, 15);     add(connectbtn_right);     connectbtn_left.setcursor(cursor             .getpredefinedcursor(cursor.default_cursor));      connectbtn_left.setvisible(false);     connectbtn_left.setpreferredsize(new dimension(25, 25));     connectbtn_left.setminimumsize(new dimension(12, 12));     connectbtn_left.setmaximumsize(new dimension(15, 15));     connectbtn_left.setfont(new font("dialog", font.plain, 12));     connectbtn_left.setborderpainted(false);     connectbtn_left.setborder(null);     connectbtn_left.setbackground(systemcolor.activecaption);     connectbtn_left.setbounds(2, getheight() / 2 - 5, 15, 15);     add(connectbtn_left); }  /**  * private method initialize {@linkplain jlabel} displaying  * informations.  */ private void initiconpnl() {     lblicon.sethorizontaltextposition(swingconstants.center);     lblicon.sethorizontalalignment(swingconstants.center);     lblicon.setalignmentx(component.center_alignment);     lblicon.seticon(new imageicon(abutton.class             .getresource("/javax/swing/plaf/metal/icons/ocean/error.png")));     lblicon.setborder(null);     lblicon.setfont(new font("dialog", font.plain, 12));      lblicon.setbounds(getwidth() / 4, 3, getwidth() / 2,             getheight() / 4 + 2);     lblicon.setlayout(null);     add(lblicon);      lblinfo1.setfont(new font("tahoma", font.bold, getheight() / 10));     lblinfo1.setforeground(systemcolor.desktop);     lblinfo1.setbounds(22, getheight() / 2 - 5, getwidth() - 42,             getheight() / 8);     add(lblinfo1);      lblinfo2.setfont(new font("tahoma", font.bold, getheight() / 10));     lblinfo2.setforeground(color.black);     lblinfo2.setbounds(10, getheight() / 2 - 5 + getheight() / 8 + 5,             getwidth() - 20, getheight() / 8);     add(lblinfo2);      lblinfo3.setfont(new font("tahoma", font.bold, getheight() / 10));     lblinfo3.setforeground(color.black);     lblinfo3.setbounds(10, getheight() / 2 - 5 + 2 * (getheight() / 8 + 5),             getwidth() - 20, getheight() / 8);     add(lblinfo3); }  public string getlblinfo(int index) {     if (index == 1) {         return lblinfo1.gettext();     } else if (index == 2) {         return lblinfo2.gettext();     } else {         return lblinfo3.gettext();     } }  public void setlblinfo(string text, int index) {     if (index == 1) {         lblinfo1.settext(text);     } else if (index == 2) {         lblinfo2.settext(text);     } else {         lblinfo3.settext(text);     } }  public point getlocation() {     return new point(getx(), gety()); }  public point getinputlocation() {     return connectbtn_left.getlocation(); }  /**  * methode um die location des objektes zu ändern und dies auch zu repainten.   * dient dazu damit der fehler das wenn ein objekt gelöscht wird die restlichen in die mitte  * wandern.  */ public void setlocation(point p){     location = p; }  public point getoutputlocation() {     return connectbtn_right.getlocation(); }  public int getmode() {     return mode; }  public void setmode(int mode) {     this.mode = mode;     showconnectors(); }  public jbutton getdelbtn() {     return delbtn; }  public int getindex() {     return id; }  public void setindex(int index) {     this.id = index; }  @override public void paintcomponent(graphics g) {     super.paintcomponent(g);     this.setlocation(location.x, location.y);     if (lblinfo1.gettext().equals("join")) {         if (children.size() == 2) {             lblicon.seticon(new imageicon(                     "c:\\users\\akaradag\\pictures\\javaicon\\ok-icon.png"));         } else if (children.size() > 2) {             lblicon.seticon(new imageicon(                     abutton.class                             .getresource("/javax/swing/plaf/metal/icons/ocean/warning.png")));         } else {             lblicon.seticon(new imageicon(                     abutton.class                             .getresource("/javax/swing/plaf/metal/icons/ocean/error.png")));         }     } else if (lblinfo1.gettext().equals("jdbc")             || lblinfo1.gettext().equals("file")) {         if (parent != null) {             lblicon.seticon(new imageicon(                     "c:\\users\\akaradag\\pictures\\javaicon\\ok-icon.png"));         } else {             lblicon.seticon(new imageicon(                     abutton.class                             .getresource("/javax/swing/plaf/metal/icons/ocean/error.png")));         }     } }  public void setoutput(abutton out) {     parent = out; }  public abutton getoutput() {     return parent; }  public void addinput(abutton input) {     if (!contains(input)) {         this.children.add(input);     } }  private boolean contains(abutton in) {     (int = 0; < this.children.size(); i++) {         if (this.children.get(i).getindex() == in.getindex()) {             return true;         }     }     return false; }  public arraylist<abutton> getinput() {     return this.children; }  public void removefrominput(abutton remove) {     (int = 0; < this.children.size(); i++) {         if (this.children.get(i) != null) {             if (this.children.get(i).getindex() == remove.getindex()) {                 this.children.remove(i);             }         }     } }  public void resetconnections() {     if (parent != null) {         arraylist<abutton> in = parent.getinput();         (int = 0; < in.size(); i++) {             if (in.get(i).getindex() == id) {                 in.remove(i);             }         }         parent = null;     }      (int = 0; < this.children.size(); i++) {         this.children.get(i).setoutput(null);         this.children.get(i).repaint();     }     this.children = new arraylist<abutton>();  //      if(connectionsdeletednotify != null) //          connectionsdeletednotify.actionperformed(new actionevent(this, 0, "deconnect")); }  /**  * setter datafactory  * @param df  */ public void setdatafactory(datafactory df) {     this.datafactory = df; }  /**  * getter datafactory  * @return  */ public datafactory getdatafactory() {     return this.datafactory; }  public datasourceplugin getdatasourceplugin() {     return datasourceplugin; }  public void setdatasourceplugin(datasourceplugin datasourceplugin) {     this.datasourceplugin = datasourceplugin; } } 

here code of main panel

import java.awt.basicstroke; import java.awt.color; import java.awt.dimension; import java.awt.font; import java.awt.graphics; import java.awt.graphics2d; import java.awt.point; import java.awt.renderinghints; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.line2d; import java.util.arraylist;  import javax.swing.abstractaction; import javax.swing.borderfactory; import javax.swing.jcomponent; import javax.swing.jlabel; import javax.swing.jmenuitem; import javax.swing.jpanel; import javax.swing.jpopupmenu;  import org.pentaho.reporting.designer.core.settings.workspacesettings; import org.pentaho.reporting.engine.classic.core.datafactory; import org.pentaho.reporting.engine.classic.core.masterreport; import org.pentaho.reporting.engine.classic.core.designtime.datasourceplugin; import org.pentaho.reporting.engine.classic.core.designtime.defaultdatafactorychangerecorder; import org.pentaho.reporting.engine.classic.core.metadata.datafactorymetadata; import org.pentaho.reporting.engine.classic.core.metadata.datafactoryregistry; import org.slf4j.logger; import org.slf4j.loggerfactory;  import com.inform_ac.reporting.datasource.dataintegrator.frontend.dataintegratordesigntimecontext; import com.inform_ac.reporting.datasource.dataintegrator.frontend.component.abutton; import com.inform_ac.reporting.datasource.dataintegrator.frontend.component.aconfirmdialog; import com.inform_ac.reporting.datasource.dataintegrator.frontend.component.adeletebutton;  public class dataintegratormainpanel extends jpanel {   dataintegratordesigntimecontext context; jpopupmenu popmen = new jpopupmenu();  jmenuitem menu1 = new jmenuitem("add new datasource:"); jmenuitem menu2 = new jmenuitem("join");  dimension dim = new dimension(); point holdingpoint , point1, point2;;  /**  * arraylist für die visuellen datasources  */ arraylist<abutton> abuttonlist = new arraylist<abutton>();  /**  * nummerierungen der abuttons  */ int index = 0;  /**  * <code>logger</code> of instance  */ protected final static logger logger = loggerfactory.getlogger(dataintegratorquerypanel.class);  private static final long serialversionuid = 4705352682546516889l;  public dataintegratormainpanel() {     initpopupmenu();     initmouselistener(); }  protected void initmouselistener() {     this.addmouselistener(new mouseadapter() {          @override         public void mousereleased(mouseevent e) {             if (e.getbutton() == mouseevent.button3){                 popmen.show(e.getcomponent(), e.getx(), e.gety());             }         }     }); }  /**  * Überschrift bei rechtsklick  * @param header  * @return jcomponent  */ protected jcomponent createheader(string header) {     jlabel label = new jlabel(header);     label.setfont(label.getfont().derivefont(font.bold,14));     label.setborder(borderfactory.createemptyborder(5, 5, 5, 5));      return label; }  protected void givemouselistenerto(abutton button) {             button.addmousemotionlistener(new mouseadapter() {          @override          public void mousedragged(mouseevent me) {             super.mousedragged(me);             abutton tmp = (abutton) me.getsource();              //mode moving             if(tmp.getmode()==0){              point point = getmouseposition();              //Über den rand raus             if(point != null) {                 point.x = point.x - holdingpoint.x;                 point.y = point.y - holdingpoint.y;                  if(point.x >= 0 && point.y >= 0) {                     tmp.setlocation(point);                 }                 //logger.info(""+point);             }             }             else if (tmp.getmode()==1) {                 point2 = getmouseposition();             }             repaint();         }     });       button.addmouselistener(new mouseadapter() {          @override         public void mousepressed(mouseevent me) {             super.mousepressed(me);              abutton tmp = (abutton) me.getsource();             if (tmp.getmode() == 0) {                 holdingpoint = tmp.getmouseposition();             }              else if (tmp.getmode() == 1) {                 point tmp_point = tmp.getlocation();                  point1 = new point(tmp.connectbtn_right.getlocation().x+tmp_point.x,tmp.connectbtn_right.getlocation().y+tmp_point.y);                 logger.info("point1: "+point1);             }         }          @override         public void mousereleased(mouseevent me) {             super.mousereleased(me);             try {                 abutton destination = (abutton) getcomponentat(getmouseposition());                 abutton source = (abutton) me.getsource();                 if (destination != null && source.getmode() == 1) {                      // hier muss der baum verkettet werden                     if (destination != source) {                         destination.addinput(source);                          if (source.getoutput() == null) {                             source.setoutput(destination);                         } else {                             abutton tmp = source.getoutput();                             tmp.removefrominput(source);                             source.setoutput(destination);                         }                         source.setmode(0);                         destination.setmode(0);                     }                 }             } catch (classcastexception e) {                 point2 = null;             }             point1 = null;             point2 = null;             repaint();         }     });     repaint(); }  protected void initpopupmenu() {     popmen.add(createheader("neue datasource"));     popmen.addseparator();       context = new dataintegratordesigntimecontext(new masterreport());      final datafactorymetadata[] datas = datafactoryregistry.getinstance()             .getall();      (final datafactorymetadata data : datas) {          // of datafactories not needed         if (data.ishidden()) {             continue;         } else if (!workspacesettings.getinstance().isshowexpertitems()                 && data.isexpert()) {             continue;         } else if (!workspacesettings.getinstance().isshowdeprecateditems()                 && data.isdeprecated()) {             continue;         } else if (!workspacesettings.getinstance()                 .isexperimentalfeaturesvisible() && data.isexperimental()) {             continue;         } else if (!data.iseditoravailable()) {             continue;         }          if (data.getdisplayname(getlocale()).equals("dataintegrator")) {             continue;         }          jmenuitem item = new jmenuitem(new abstractaction(                 data.getdisplayname(getlocale())) {                      private static final long serialversionuid = 7700562297221703939l;                      @override                     public void actionperformed(actionevent arg0) {                         point mousepos = getmouseposition();                         final abutton tmp = new abutton(mousepos.x,mousepos.y,index++);                          // action listener hier und nicht in die schleife                         tmp.getdelbtn().addactionlistener(new actionlistener() {                             public void actionperformed(actionevent arg0) {                                 adeletebutton tmp_1 = (adeletebutton) arg0                                         .getsource();                                 abutton source = tmp_1.getabutton();                                 aconfirmdialog dialog = new aconfirmdialog();                                  int opt = dialog.getstate();                                 if (opt == 1) {                                     (int = 0; < abuttonlist.size(); i++) {                                         if (source.getindex() != abuttonlist.get(i)                                                 .getindex()) {                                              if (abuttonlist.get(i).getoutput() != null                                                     && abuttonlist.get(i).getoutput()                                                             .getindex() == source                                                             .getindex()) {                                                 abuttonlist.get(i).setoutput(null);                                             }                                             abuttonlist.get(i).removefrominput(source);                                         }                                     }                                      // seperat erst die referenzen löschen dann das                                     // objekt aus der liste                                     (int = 0; < abuttonlist.size(); i++) {                                         if (source.getindex() == abuttonlist.get(i)                                                 .getindex()) {                                             abuttonlist.remove(i);                                             source.setvisible(false);                                             source.setenabled(false);                                         }                                     }                                 }                             }                         });                          logger.info("--> data: " + data);                         final datasourceplugin editor = data.createeditor();                         logger.info("--> editor: " + editor);                         final defaultdatafactorychangerecorder recorder = new defaultdatafactorychangerecorder();                          final datafactory datafactory = editor.performedit(context,                                 null, null, recorder);                         logger.info("--> datafactory: " + datafactory);                          // falls die datafactory initialisiert werden konnte                         if (datafactory != null) {                             tmp.setdatasourceplugin(editor);                             tmp.setdatafactory(datafactory);                              add(tmp);                              //logger.info("new datafact"+mousepos);                              abuttonlist.add(tmp);                              //moving listener                             givemouselistenerto(tmp);                             validate();                         }                       }         });         popmen.add(item);     } }  @override public void paintcomponent(graphics g) {     super.paintcomponent(g);          graphics2d g2d = (graphics2d) g;          g2d.setstroke(new basicstroke(1.5f));           g2d.setrenderinghint(renderinghints.key_antialiasing,                 renderinghints.value_antialias_on);          line2d tmp_line;         (int = 0; < abuttonlist.size(); i++) {             if (abuttonlist.get(i).getoutput() != null) {                 g2d.setstroke(new basicstroke(1.5f));                 int x1 = abuttonlist.get(i).getlocation().x                         + abuttonlist.get(i).connectbtn_right.getlocation().x;                 int y1 = abuttonlist.get(i).getlocation().y                         + abuttonlist.get(i).connectbtn_right.getlocation().y;                 int x2 = abuttonlist.get(i).getoutput().getlocation().x                         + abuttonlist.get(i).getoutput().connectbtn_left                                 .getlocation().x - 4;                 int y2 = abuttonlist.get(i).getoutput().getlocation().y                         + abuttonlist.get(i).getoutput().connectbtn_left                                 .getlocation().y;                  tmp_line = new line2d.double(x1, y1, x2, y2);                 double m = (y2 - y1) / (double) (x2 - x1);                 //logger.info("m: "+m);                  int vz = x2-x1;                 //logger.info("vz: "+vz);                  if(vz<0)                 {                     vz = 20;                 }                 else if (vz>0){                     vz = -20;                 }                  if(m<4 && m>-4) {                      point p = new point(x2 -20, (int) (y1 + m * (x2 - x1 - 20)));                     //logger.info(p.tostring());                      line2d tmp2_line = new line2d.double(x2, y2, x2 + vz,                             p.y + 3);                     //logger.info("x2: "+x2+", y2: "+y2+", p.y:"+p.y);                      line2d tmp3_line = new line2d.double(x2, y2, x2 + vz,                             p.y - 3);                     //logger.info("x2: "+x2+", y2: "+y2+", p.y:"+p.y);                      g2d.setpaint(color.black);                     g2d.draw(tmp2_line);                     g2d.draw(tmp3_line);                 }                 g2d.draw(tmp_line);              }         }         if (point1 != null && point2 != null) {             line2d line2d = new line2d.double(point1, point2);             g2d.setpaint(color.red);             g2d.setstroke(new basicstroke(1.5f));// set stroke size             g2d.draw(line2d);         } } } 

so error happens if click on editbtn und click example on connect. repaints whole panel , abuttons in panel located in middle top of panel vertically frames , goes locations saved in object itselft.

also can reproduce error using validate().

i dont understand problem here. why changing locations of components in main panel after validation?

and sorry if code not sscce couldn't work without pentaho libraries...

  1. i suggest use of layout manager, in respect preferable; may take time @ first, worthy. simple use cases, built-in ones, borderlayout, gridbaglayout may suffice. but, more control, try miglayout: complete, elegant, , precise. (http://www.miglayout.com/)

  2. if ask why, javadoc has it:

void java.awt.container.validate()

validates container , of subcomponents.

validating container means laying out subcomponents. layout-related changes, such setting bounds of component, or adding component container, invalidate container automatically. note ancestors of container may invalidated (see component.invalidate details.) therefore, restore validity of hierarchy, validate() method should invoked on top-most invalid container of hierarchy.

validating container may quite time-consuming operation. performance reasons developer may postpone validation of hierarchy till set of layout-related operations completes, e.g. after adding children container.

if container not valid, method invokes validatetree method , marks container valid. otherwise, no action performed.

overrides: validate() in component


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -