Получение позиции JPopupMenu - PullRequest
5 голосов
/ 18 мая 2009

У меня проблемы с получением позиции JPopupMenu .

Что мне нужно, чтобы иметь возможность щелкнуть правой кнопкой мыши на рабочей области, щелкнуть некоторые
пункта меню, а затем создайте элемент на месте прямо под положением ранее отображенного меню.

Я попытался определить положение самого меню и его пунктов,
но это дает мне постоянные значения около 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 ]

6 голосов
/ 18 мая 2009

getLocation () возвращает местоположение относительно координатного пространства родительских компонентов. Вот почему item1.getLocation () всегда возвращает одно и то же значение, поскольку оно всегда находится в одном и том же месте относительно всплывающего меню.

При чтении Javadoc звучит так, будто вызов mainFrame.getMousePosition () может вернуть искомую точку.

5 голосов
/ 23 февраля 2010

Старая тема, но у меня недавно была эта проблема. Проблема здесь в том, что во время вызова ActionPerformed видимость PopupMenu уже была установлена ​​в false, что означает, что его местоположение больше не определено (т. Е. (0,0)). Я разрабатываю для интерфейса без мыши, поэтому захват позиции мыши был для меня невозможен. В итоге я сохранил положение меню каждый раз, когда оно стало видимым, и использовал его для создания своего компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...