1

我想在 Swing 组件中捕获鼠标事件,例如 MouseDrag 事件等,但是我发现当我快速移动鼠标时缺少一些事件,

似乎并非所有事件都被捕获。我捕获的鼠标轨迹是离散的,但我想要鼠标轨迹,精度为 1 像素。

请问你能帮帮我吗?非常感谢。

4

3 回答 3

5

你不能这样做。甚至鼠标本身也不会向计算机报告每个像素(或它使用的任何单位)。

您必须插入缺失的点。单个线性插值应该可以解决问题。

于 2013-01-02T12:18:02.597 回答
1

如果您只想捕获某个组件上的鼠标移动,那么您只需要 MouseDrag 事件等。正如 Matti Virkkunen 所说,如果你想要一条连续的线,你必须进行点对点插值。

如果您询问捕获容器及其子组件内发生的所有事件,那么您可能会考虑访问 EventQueues。但是,我对此一无所知,但在 google 上搜索可能会找到您需要的地方。

于 2013-01-02T13:04:23.737 回答
0

一个非常简单的解决方案——尤其是在绘画方面——是使用提供的 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)。

于 2013-01-02T13:53:03.130 回答