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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -