我想在Swing组件中捕获鼠标事件,比如MouseDrag事件等,但我发现当我快速移动鼠标时会丢失一些事件,
似乎并非所有事件都被捕获。我捕获的鼠标痕迹是离散的,但我想要鼠标的痕迹,精度为1像素。
你能帮帮我吗?非常感谢。答案 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)绘制这些形状。