java - JFrame wrong location with Ubuntu (Unity ?) -
it seems there bug ubuntu (maybe unity). decoration of jframe taken account getlocation()
, getsize()
, not setlocation()
, setsize()
. leads weird behaviour. instance, if use pack() after frame displayed , dimensions changed, frame go down 20 pixels...
to illustrate concrete case when becomes annoying, made sscce. it's jframe basic jpanel. if drag panel, jframe supposed move along.
under windows, works expected. under ubuntu, if setundecorated(true)
work fine, if let decoration, jframe turn crazy !
public class test { private static jframe mainframe; public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { mainframe = new jframe("test"); mainframe.setsize(300,20); mainframe.setdefaultcloseoperation(jframe.dispose_on_close); mainframe.setvisible(true); container pane = mainframe.getcontentpane(); pane.addmousemotionlistener(new mousemotionlistener() { private int posx = 0, posy = 0; @override public void mousedragged(mouseevent e) { int x = e.getx() - posx + mainframe.getx(); int y = e.gety() - posy + mainframe.gety(); mainframe.setlocation(x, y); } @override public void mousemoved(mouseevent e) { posx = e.getx(); posy = e.gety(); } }); } }); } }
i don't know how can fix that. how can size of windows decoration ? , have no idea versions of ubuntu concerned. , if unity problem, don't know how find out if user using unity...
any idea workaround ?
edit : ok, madprogrammer did provide better code, bug still occurs sometimes. edited mouselistener accordingly track bug :
pane.addmousemotionlistener(new mousemotionlistener() { private int posx = 0, posy = 0; @override public void mousedragged(mouseevent e) { int x = e.getxonscreen() - posx; int y = e.getyonscreen() - posy; mainframe.setlocation(x, y); system.out.println("drag : border ignored / border considered : "+(mainframe.gety()+e.gety())+" / "+e.getyonscreen()); } @override public void mousemoved(mouseevent e) { posx = e.getxonscreen() - mainframe.getx(); posy = e.getyonscreen() - mainframe.gety(); system.out.println("move : border ignored / border considered : "+e.gety()+" / "+posy); } });
each time 2 values identical, means bug occur on next click. otherwise, values different. on other os, values same. actually, should or same always, or different. don't understand how can equal , different...
i don't have ubuntu test with, i've used similar on both macos , windows
import java.awt.container; import java.awt.point; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.event.mousemotionlistener; import javax.swing.jframe; import javax.swing.swingutilities; public class test { private static jframe mainframe; public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { mainframe = new jframe("test"); mainframe.setsize(300, 100); mainframe.setdefaultcloseoperation(jframe.dispose_on_close); mainframe.setvisible(true); container pane = mainframe.getcontentpane(); mouseadapter ma = new mouseadapter() { private point offset; @override public void mousedragged(mouseevent e) { if (offset != null) { point pos = e.getlocationonscreen(); int x = pos.x - offset.x; int y = pos.y - offset.y; system.out.println(x + "x" + y); swingutilities.getwindowancestor(e.getcomponent()).setlocation(x, y); } } @override public void mousepressed(mouseevent e) { point pos = swingutilities.getwindowancestor(e.getcomponent()).getlocation(); // point pos = e.getcomponent().getlocationonscreen(); offset = new point(e.getlocationonscreen()); system.out.println(pos + "/" + offset); offset.x -= pos.x; offset.y -= pos.y; system.out.println(offset); } }; pane.addmouselistener(ma); pane.addmousemotionlistener(ma); } }); } }
this should work both decorated , undecorated windows, takes difference between positions of component (on screen) , windows current position. when dragged, calculates distance of movement click point , updates window's location accordingly (allowing original offset of click)
Comments
Post a Comment