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

时间:2014-03-27 20:23:54

标签: java swing mouseevent

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

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

如何通知组件或其侦听器鼠标已经覆盖并且已被释放?

2 个答案:

答案 0 :(得分:3)

如果将MouseListener添加到包含感兴趣组件的容器中,则可以在按下或拖动时找出鼠标所在的组件。例如,在下面的代码中,我将MouseAdapter(一个组合MouseListener,MouseMotionListener和MouseWheelListener)添加到包含JPanel,并在获取容器上的鼠标事件的位置后,我在我的上面调用getComponentAt(Point 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();
         }
      });
   }
}

答案 1 :(得分:0)

是的,我在项目中处理了类似的事情。我在容器中的所有组件上使用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();
    }
}