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