我想在 Swing 组件中捕获鼠标事件,例如 MouseDrag 事件等,但是我发现当我快速移动鼠标时缺少一些事件,
似乎并非所有事件都被捕获。我捕获的鼠标轨迹是离散的,但我想要鼠标轨迹,精度为 1 像素。
请问你能帮帮我吗?非常感谢。
你不能这样做。甚至鼠标本身也不会向计算机报告每个像素(或它使用的任何单位)。
您必须插入缺失的点。单个线性插值应该可以解决问题。
如果您只想捕获某个组件上的鼠标移动,那么您只需要 MouseDrag 事件等。正如 Matti Virkkunen 所说,如果你想要一条连续的线,你必须进行点对点插值。
如果您询问捕获容器及其子组件内发生的所有事件,那么您可能会考虑访问 EventQueues。但是,我对此一无所知,但在 google 上搜索可能会找到您需要的地方。
一个非常简单的解决方案——尤其是在绘画方面——是使用提供的 Graphics 和 Graphics2D 对象:
static class MyPanel extends JPanel {
private static final long serialVersionUID = -5482850214654836564L;
private int lastX = -1;
private int lastY = -1;
public MyPanel() {
super(true); // activate double buffering
addMouseListener(new MouseAdapter() {
@Override public void mousePressed(final MouseEvent pE) {
final int newX = pE.getX();
final int newY = pE.getY();
final Graphics g = getGraphics();
if (g == null) return; // panel not visible
g.drawLine(lastX, lastY, newX, newY); // or add to list
lastX = newX;
lastY = newY;
}
});
}
}
public static void main(final String[] args) {
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setBounds(200, 200, 400, 400);
f.add(new MyPanel());
f.setVisible(true);
}
要获得更一致的系统,请查看 Java 形状(RoundRectangle、Polygon)等。这些可以在侦听器部分创建,然后存储在列表中,在 paint()/paintComponent() 方法中,您可以使用绘制这些形状g.fill() 或 g.drawPolygon(p)。