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