java - Make JPopupMenu Display with a Certain Bottom Left Coordinate -


say want make button in java in such way when click on it, jpopupmenu appears. relevant code appearing menu.show(button, button.getwidth()/2, button.getheight()/2);, makes jpopupmenu displayed top left corner @ center of button, shown below:

current swing jpopupmenu

however, have instead bottom left corner @ center of button, itunes (there button underneath bottom left corner, same size + button left of it):

enter image description here

i tried make happen getting height of jpopupmenu , adding y coordinate popup menu being displayed at, found out jpopupmenu has height of 0 before visible, doesn't me since i'm trying tell computer make visible. also, hardcoding in offset isn't possible because number of items in popup isn't going same.

how can make jpopupmenu unknown height can displayed it's bottom left coordinate matches given coordinate?

basically, creates popup menu , registers component using jcomponent#setcomponentpopupmenu. means no longer need monitor mouse events or make decisions when show popup.

i override jcomponent#getpopuplocation , calculate location want popup appear.

basically, jcomponent#getcomponentpopupmenu, it's preferred size , calculate appropriate offset bottom, left corner appears in center of component...

enter image description here

import java.awt.borderlayout; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.point; import java.awt.event.mouseevent; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jmenuitem; import javax.swing.jpanel; import javax.swing.jpopupmenu; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class testpopup02 {      public static void main(string[] args) {         new testpopup02();     }      public testpopup02() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                 }                  jframe frame = new jframe("testing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                 frame.add(new testpane());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class testpane extends jpanel {          public testpane() {             jpopupmenu menu = new jpopupmenu();             menu.add(new jmenuitem("edit playlist"));             menu.addseparator();             menu.add(new jmenuitem("check available downloads..."));             menu.addseparator();             menu.add(new jmenuitem("export..."));             menu.add(new jmenuitem("burn playlist disc"));             menu.add(new jmenuitem("copy play order"));             menu.addseparator();             menu.add(new jmenuitem("delete"));             setcomponentpopupmenu(menu);         }          @override         public point getpopuplocation(mouseevent event) {             // registered popup menu...             jpopupmenu popup = getcomponentpopupmenu();             // super point, in case...             point pos = super.getpopuplocation(event);             if (popup != null) {                 // create new "point" location                 pos = new point();                 // preferred size of menu...                 dimension size = popup.getpreferredsize();                 // adjust x position left side of popup                 // appears @ center of  component                 pos.x = (getwidth() / 2);                 // adjust y position y postion (top corner)                 // positioned bottom of popup                 // appears in center                 pos.y = (getheight() / 2) - size.height;             }             return pos;         }          @override         public dimension getpreferredsize() {             return new dimension(400, 200);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             // draws cross in center of window,              // know center is...             int width = getwidth() - 1;             int height = getheight() - 1;             g.drawline(width / 2, 0, width / 2, height);             g.drawline(0, height / 2, width, height / 2);         }      } } 

update mac output

enter image description here

button example

it unlikely ever find solution meets precisely needs. 1 of greatest skills developer can develop ability take idea , mold there needs.

the previous example holds every thing need, need able make leap concept solution.

getpopuplocation part of component popup api, either overriding method or calling isn't quite need (unless have dedicated button task, may not bad thing), need adapt solution needs...

enter image description here

import java.awt.borderlayout; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.gridbaglayout; import java.awt.point; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseevent; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jmenuitem; import javax.swing.jpanel; import javax.swing.jpopupmenu; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class testpopup02 {      public static void main(string[] args) {         new testpopup02();     }      public testpopup02() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                 }                  jframe frame = new jframe("testing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                 frame.add(new testpane());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class testpane extends jpanel {          private jbutton button;         private jpopupmenu popup;          public testpane() {             popup = new jpopupmenu();             popup.add(new jmenuitem("edit playlist"));             popup.addseparator();             popup.add(new jmenuitem("check available downloads..."));             popup.addseparator();             popup.add(new jmenuitem("export..."));             popup.add(new jmenuitem("burn playlist disc"));             popup.add(new jmenuitem("copy play order"));             popup.addseparator();             popup.add(new jmenuitem("delete"));              setlayout(new gridbaglayout());             button = new jbutton("+");             button.addactionlistener(new actionlistener() {                 @override                 public void actionperformed(actionevent e) {                     popup.pack();                     point pos = new point();                     // preferred size of menu...                     dimension size = popup.getpreferredsize();                     // adjust x position left side of popup                     // appears @ center of  component                     pos.x = (button.getwidth() / 2);                     // adjust y position y postion (top corner)                     // positioned bottom of popup                     // appears in center                     pos.y = (button.getheight() / 2) - size.height;                     popup.show(button, pos.x, pos.y);                 }             });             add(button);         }          @override         public dimension getpreferredsize() {             return new dimension(400, 200);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             // draws cross in center of window,              // know center is...             int width = getwidth() - 1;             int height = getheight() - 1;             g.drawline(width / 2, 0, width / 2, height);             g.drawline(0, height / 2, width, height / 2);         }     } } 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -