是否可以在未按下它的组件上侦听鼠标释放事件?
我知道当释放鼠标时,即使光标位于其他组件上方,当鼠标按下时,也会在该组件的侦听器上调用MouseListener.mouseReleased()
。
如何通知组件或其侦听器鼠标已经覆盖并且已被释放?
答案 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();
}
}