如何捕获Java中的所有鼠标事件?

时间:2013-01-02 12:15:13

标签: java mouse

我想在Swing组件中捕获鼠标事件,比如MouseDrag事件等,但我发现当我快速移动鼠标时会丢失一些事件,

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

如果您要求捕获Container内部发生的所有事件及其子组件,那么您可以考虑访问EventQueues。 但是,我对此并不了解,但搜索谷歌可能会让你到达你需要的地方。

答案 2 :(得分: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 Shapes(RoundRectangle,Polygon)等。 这些可以在侦听器部分创建,然后存储在列表中,在paint()/ paintComponent()方法中,您可以使用g.fill()或g.drawPolygon(p)绘制这些形状。