2013-10-21 22 views
3

我的JPopupMenu显示在鼠标右键单击上。我需要JPopupMenu'右上角的click location(不是左上角的默认值)。要执行此操作,我需要将X坐标设置为mouseEvent.getX() - popupMenu.getWidth()。问题是,弹出式显示首次使用前,它的宽度等于0在显示之前获取JPopupMenu的尺寸

SSCCE:

public class PopupTest2 { 
    public static void main(String[] a) { 
     final JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel panel = new JPanel(new BorderLayout()); 
     panel.setBorder(BorderFactory.createLineBorder(Color.RED)); 

     final JPopupMenu menu = new JPopupMenu(); 

     for (int i = 0; i < 10; i++) { 
      JMenuItem item = new JMenuItem("Item #"+String.valueOf(i)); 
      menu.add(item); 
     } 

     panel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (e.getButton() == MouseEvent.BUTTON3) { 
        // first time works wrong 
        menu.show(panel, e.getX() - menu.getWidth(), e.getY()); 
       } 
      } 
     }); 
     frame.setContentPane(panel); 
     frame.setUndecorated(true); 
     frame.setBackground(new Color(50, 50, 50, 200)); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+2

什么的首选显示前JPopupMenu的大小? – StanislavL

+1

如果我记得,你可以先打包菜单,然后得到它的首选大小[示例在这里](http://stackoverflow.com/questions/16475417/make-jpopupmenu-display-with-a-certain-bottom-left -coordinate/16475904#16475904) – MadProgrammer

+0

@StanislavL请将您的评论写为答案。 – SeniorJD

回答

2

什么的首选显示前JPopupMenu的大小?

1

大概就可以判断上下文菜单的宽度为IST元件的最高优选宽度?

+0

不是最好的解决方案,但谢谢 – SeniorJD

4

使用preferredSize(如前所述)是获取位置的方法。

但是(在这里的任务:-):手动显示弹出窗口是而不是推荐的方法。一个真正干净的实施将使用componentPopupMenu属性,并根据需要实施getPopupLocation,像

JPanel panel = new JPanel(new BorderLayout()) { 

    @Override 
    public Point getPopupLocation(MouseEvent event) { 
     JPopupMenu menu = getComponentPopupMenu(); 
     if (menu == null || event == null) return null; 
     return new Point(event.getX() - menu.getPreferredSize().width, event.getY()); 
    } 

}; 
JPopupMenu menu = new JPopupMenu(); 
panel.setComponentPopupMenu(menu); 
+0

和...创建一个匿名类*是*推荐的方法?嗯... – SeniorJD

+1

重要的部分是使用componentPopupMenu属性和_what_覆盖来影响它的位置 - 轮到你为生产打扮:-) – kleopatra

0

使用popup.getPreferredSize().widthpopup.getPreferredSize().height您可以在弹出窗口大小显示之前使用。

这是一个例子定位在弹出菜单中的一个按钮的顶部:

but_menu = new JButton(""); 
but_menu.addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     Point p = but_menu.getLocation(); 
     Point dest = new Point(); 
     dest.x = 0 - popup.getPreferredSize().width + but_menu.getWidth(); 
     dest.y = 0 - popup.getPreferredSize().height; 
     popup.show(but_menu,dest.x,dest.y); 
    } 
});