java - JDesktopPane resize -


we have application 2 jframes 2 jdesktoppanes. need move internal frame 1 frame another.

the problem have after move internalframe first window second window, when resize fist window, internal frame of second window gets resized.

import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.beans.propertyvetoexception;  import javax.swing.jdesktoppane; import javax.swing.jframe; import javax.swing.jinternalframe; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmenuitem;  class firstframe extends jframe {   jdesktoppane desktoppane = new jdesktoppane();    secondframe secondframe;    public firstframe(secondframe secondframe)   {     this.secondframe = secondframe;     settitle("firstframe example");     setdefaultcloseoperation(exit_on_close);     add(desktoppane);      jmenubar menubar = new jmenubar();     jmenu menu = new jmenu("file");     jmenuitem item = new jmenuitem("move");      item.addactionlistener(new actionlistener()     {        @override       public void actionperformed(actionevent actionevent)       {         moveframe();       }     });      menu.add(item);     menubar.add(menu);     setjmenubar(menubar);    }    public void addaninternalframe()   {     jinternalframe frame = new jinternalframe();     frame.settitle("an internal frame");      desktoppane.add(frame);     frame.setvisible(true);     frame.setmaximizable(true);     try     {       frame.setselected(true);       frame.setmaximum(true);     }     catch (propertyvetoexception e)     {       e.printstacktrace();     }    }    public void moveframe()   {     jinternalframe selectedframe = desktoppane.getselectedframe();     desktoppane.remove(selectedframe);     desktoppane.repaint();      secondframe.addinternalframe(selectedframe);   } }  class secondframe extends jframe {   jdesktoppane desktoppane = new jdesktoppane();    public secondframe()   {     settitle("secondframe example");     setdefaultcloseoperation(exit_on_close);     add(desktoppane);   }    public void addinternalframe(jinternalframe frame)   {     desktoppane.add(frame);   } }  public class desktoppaneexample {   public static void main(string args[]) throws propertyvetoexception   {      secondframe secondframe = new secondframe();      firstframe firstframe = new firstframe(secondframe);      firstframe.setsize(400, 400);     firstframe.setlocation(100, 100);     firstframe.setvisible(true);     firstframe.addaninternalframe();      secondframe.setsize(400, 400);     secondframe.setlocation(520, 100);     secondframe.setvisible(true);       } } 

in above sample application, reproduce 1) click menu file>move 2) resize first window

note: reproducable in java 1.7 only. use jdk1.7.0_03.

update: add more information

this not reproducible on java 1.6 (jdk1.6.0_21)

the issue due java 7's tweaking on javax.swing.plaf.basic.basicinternalframeui implementation.

  • java 1.6 code

    public void propertychange(propertychangeevent evt) {

            if ((frame.getparent() != null) && !componentlisteneradded) {             f.getparent().addcomponentlistener(componentlistener);             componentlisteneradded = true;         } else if ((newvalue == null) && componentlisteneradded) {             if (f.getparent() != null) {                 f.getparent()                         .removecomponentlistener(componentlistener);             }             componentlisteneradded = false;         } 
  • java 1.7 code

    public void propertychange(propertychangeevent evt) {

            if ((frame.getparent() != null) && !componentlisteneradded) {             f.getparent().addcomponentlistener(componentlistener);             componentlisteneradded = true;         } 

    note: else if condition removed. culprit.

i suggest 2 options:

  • option one

    jinternalframe selectedframe = desktoppane.getselectedframe(); desktoppane.remove(selectedframe); desktoppane.repaint();  secondframe.updateui(); // magic part, less expensive execution.  secondframe.addinternalframe(selectedframe); 
  • option two

you may need recompile javax.swing.plaf.basic.basicinternalframeui.java above "else if" condition , add rt.jar library's javax.swing.plaf.basic location.

i have attached recompiled files java 1.7.0_25 @ http://www.datafilehost.com/d/dfb7238c

hope helps!!!

regards, nilindra


Comments

Popular posts from this blog

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