Захват мыши XY Location из всплывающего меню - PullRequest
0 голосов
/ 24 октября 2019

Я могу получить координаты XY обоих движений мыши, а также щелчок правой кнопкой мыши, чтобы открыть всплывающее меню.

Вопрос в том, как получить координаты XY в верхней части всплывающего окна. Меню по отношению к JFrame. Расположение XY, в котором появляется всплывающее окно, отличается от местоположения, в котором щелкается мышь во всплывающем окне.

Я пытался добавить прослушиватель мыши к объекту JPopupMenu, но он никогда не вводил код.

MousePopupListener выглядел многообещающе, но это тоже не помогло.

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

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

Что нужно добавить для сбора этой информации?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.border.BevelBorder;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class MousePopupExample extends JPanel {

  public JPopupMenu popup;

  public MousePopupExample()
  {
    popup = new JPopupMenu();
    ActionListener menuListener = new ActionListener() {
      public void actionPerformed(ActionEvent event) 
      {
        System.out.println("Popup menu item ["
            + event.getActionCommand() + "] was pressed.");
      }
    };
    JMenuItem item;
    popup.add(item = new JMenuItem("Left", new ImageIcon("1.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Center", new ImageIcon("2.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Right", new ImageIcon("3.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.add(item = new JMenuItem("Full", new ImageIcon("4.gif")));
    item.setHorizontalTextPosition(JMenuItem.RIGHT);
    item.addActionListener(menuListener);
    popup.addSeparator();
    popup.add(item = new JMenuItem("Settings . . ."));
    item.addActionListener(menuListener);

    popup.setLabel("Justification");
    popup.setBorder(new BevelBorder(BevelBorder.RAISED));
    popup.addPopupMenuListener(new PopupPrintListener());

    addMouseListener(new MousePopupListener());
  }


// An inner class to check whether mouse events are the popup trigger
  class MousePopupListener extends MouseAdapter 
  {
    public void mouseMoves(MouseEvent e) {
      checkPopup(e);
    }

    public void mousePressed(MouseEvent e) {
      checkPopup(e);
    }

    public void mouseClicked(MouseEvent e) {
      checkPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
      checkPopup(e);
    }

    private void checkPopup(MouseEvent e) {
      if (e.isPopupTrigger()) {
        popup.show(MousePopupExample.this, e.getX(), e.getY());
      }
    }
  }

  // An inner class to show when popup events occur
  class PopupPrintListener implements PopupMenuListener {
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
      System.out.println("Popup menu will be visible!");
    }

    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
      System.out.println("Popup menu will be invisible!");
    }

    public void popupMenuCanceled(PopupMenuEvent e) {
      System.out.println("Popup menu is hidden!");
    }
  }

  public static void main(String s[]) {
    JFrame frame = new JFrame("Popup Menu Example");
    XYMouseLabel xyMouseLabel = new XYMouseLabel();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MousePopupExample mpe = new MousePopupExample();

    xyMouseLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight());    
    mpe.add(xyMouseLabel);

    frame.setContentPane(mpe);
    frame.setPreferredSize(new Dimension(400, 300));
    frame.pack();

    frame.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent me)
        {
            System.out.println("Mouse Move");
          xyMouseLabel.x = me.getX();
          xyMouseLabel.y = me.getY();
          xyMouseLabel.repaint();
        }
      });

    frame.setVisible(true);
  }


}

1 Ответ

1 голос
/ 24 октября 2019

Дочерние компоненты JPopupMenu перехватывают события мыши. Вы должны добавить слушателя как к меню, так и к его дочерним элементам.

Вы можете преобразовать координаты MouseEvent, чтобы они относились к другому компоненту, например JFrame, используя SwingUtilities.convertMouseEvent :

MouseMotionListener listener = new MouseMotionAdapter() {
    @Override
    public void mouseMoved(MouseEvent me) {
        me = SwingUtilities.convertMouseEvent(
            me.getComponent(), me, frame);

        System.out.println("Mouse Move");
        xyMouseLabel.x = me.getX();
        xyMouseLabel.y = me.getY();
        xyMouseLabel.repaint();
    }
};

menu.addMouseMotionListener(listener);
for (Component child : menu.getComponents()) {
    child.addMouseMotionListener(listener);
}
...