Java 在Swing中未按下鼠标的组件上侦听鼠标释放事件

Java 在Swing中未按下鼠标的组件上侦听鼠标释放事件,java,swing,mouseevent,Java,Swing,Mouseevent,是否可以在未按下鼠标的组件上侦听鼠标释放事件 我知道当鼠标被释放时,MouseListener.mouseRelease()会在该组件的侦听器上被调用,即使光标位于其他组件的上方 如何通知组件或其侦听器鼠标已在其上并已释放?如果将鼠标侦听器添加到保存感兴趣组件的容器中,您可以在按住或拖动鼠标时找出鼠标位于哪个组件上。例如,在下面的代码中,我将我的MouseAdapter(MouseListener、MouseMotionListener和MouseWheelListener的组合)添加到包含的J

是否可以在未按下鼠标的组件上侦听鼠标释放事件

我知道当鼠标被释放时,
MouseListener.mouseRelease()
会在该组件的侦听器上被调用,即使光标位于其他组件的上方


如何通知组件或其侦听器鼠标已在其上并已释放?

如果将鼠标侦听器添加到保存感兴趣组件的容器中,您可以在按住或拖动鼠标时找出鼠标位于哪个组件上。例如,在下面的代码中,我将我的MouseAdapter(MouseListener、MouseMotionListener和MouseWheelListener的组合)添加到包含的JPanel中,在获得容器上鼠标事件的位置后,我在容器上调用
getComponentAt(点p)
,以获取鼠标所在的子组件:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class TestMouseRelease extends JPanel {
   private String[] panelNames = { "Panel A", "Panel B" };

   public TestMouseRelease() {
      setLayout(new GridLayout(1, 0));
      MouseAdapter mAdapter = new MyMouseAdapter();

      addMouseListener(mAdapter);
      addMouseMotionListener(mAdapter);

      for (String panelName : panelNames) {
         JPanel panel = new JPanel();
         panel.setName(panelName);
         // panel.addMouseListener(mAdapter);
         // panel.addMouseMotionListener(mAdapter);
         panel.setBorder(BorderFactory.createTitledBorder(panelName));
         panel.add(Box.createRigidArea(new Dimension(300, 300)));
         add(panel);
      }
   }

   private class MyMouseAdapter extends MouseAdapter {
      @Override
      public void mousePressed(MouseEvent e) {
         displayInfo(e, "mousePressed");
      }

      @Override
      public void mouseReleased(MouseEvent e) {
         displayInfo(e, "mouseReleased");
      }

      @Override
      public void mouseDragged(MouseEvent e) {
         displayInfo(e, "mouseDragged");
      }

      private void displayInfo(MouseEvent e, String info) {
         JComponent comp = (JComponent) e.getSource();
         Component childComp = comp.getComponentAt(e.getPoint());
         if (childComp != null) {
            String name = childComp.getName();
            System.out.println(name + ": " + info);
         }
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("TestMouseRelease");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new TestMouseRelease());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

是的,我在我的项目中处理过类似的事情。我在容器中的所有组件上使用
getBounds()
,并检查它们是否包含鼠标的x,y坐标。下面是我的代码:

Component[] components = jPanel1.getComponents();
for (Component c : components) {

    if (c.getBounds().contains(ev.getXOnScreen(), ev.getYOnScreen())) {
        System.out.println(c.getClass());
        y = ch.getPosY();
        x = ch.getPosX();
    }
}

您可以检查鼠标按钮释放点的坐标是否在原始组件的边界内?此问题是关于?否此问题不是关于拖放。我不明白投反对票。无论如何,我收到了正确的小费。