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:
however, have instead bottom left corner @ center of button, itunes (there button underneath bottom left corner, same size +
button left of it):
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...
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
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...
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
Post a Comment