Получение позиции JPopupMenu
У меня возникли проблемы с получением JPopupMenu
'позиция s .
Что мне нужно, так это иметь возможность щелкнуть правой кнопкой мыши на рабочей области, нажать некоторые
пункт меню, а затем создайте элемент на месте прямо под позицией ранее отображенного меню.
Я попытался определить положение самого меню и его пунктов,
но это дает мнепостоянные значения около 0. (см. комментарии в коде)
Из-за разделения интересов , меню отображается в одном классе
пока его действия обрабатываются в другом.
public final class MainFrameMenu
extends JPopupMenu
implements ActionListener {
private final MainFrame mainFrame;
private final JMenuItem item1 = new JMenuItem("add line");
private final JMenuItem item2 = new JMenuItem("add element");
public MainFrameMenu(MainFrame mainFrame) {
super("Main menu");
this.mainFrame = mainFrame;
item1.addActionListener(this);
item2.addActionListener(this);
add(item1);
add(item2);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == item1) {
System.out.println(getLocation()); // gives ALWAYS [0, 0]
System.out.println(item1.getLocation()); // gives ALWAYS [1, 3]
// I want to create an element IN PLACE
mainFrame.addConnectionLine(getX(), getY());
}
}
}
public final class PopupMouseListener
extends MouseAdapter {
private final JPopupMenu menu;
public PopupMouseListener(JPopupMenu menu) {
this.menu = menu;
}
@Override
public void mousePressed(MouseEvent e) {
popup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
popup(e);
}
private void popup(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
Я знаю, что могу хранить последнее известное положение в PopupMouseListener
,
и читать его из MainFrameMenu , но это разрушило бы классы
иерархия (большинство других случаев PopupMouseListener
мне это не нужно).
2 ответа:
GetLocation () возвращает расположение относительно пространства координат родительских компонентов. Вот почему item1.getLocation() всегда возвращает одно и то же значение, так как оно всегда находится в одном и том же месте относительно всплывающего меню.
Из чтения Javadoc это звучит как вызов мейнфрейма.getMousePosition() может вернуть точку, которую вы ищете.
Старый поток, но у меня недавно была эта проблема. Проблема здесь заключается в том, что во время вызова ActionPerformed видимость всплывающего меню уже была установлена в false, что означает, что его местоположение больше не определено (т. е. (0,0)). Я разрабатываю для интерфейса без мыши, поэтому захват положения мыши был невозможен для меня. Я закончил тем, что сохранял положение меню каждый раз, когда оно становилось видимым, и использовал его для создания своего компонента.