MouseDrag イベントなどの Swing コンポーネントでマウス イベントをキャプチャしたいのですが、マウスを非常に速く動かすといくつかのイベントが欠落していることがわかりました。
すべてのイベントがキャプチャされているわけではないようです。キャプチャしたマウスのトレースは離散的ですが、マウスのトレースが必要で、精度は 1 ピクセルです。
私を手伝ってくれますか?どうもありがとう。
これはできません。マウス自体でさえ、すべてのピクセル (またはマウスが使用する単位) をコンピューターに報告するわけではありません。
欠けている点を補間する必要があります。単一の線形補間でうまくいくはずです。
特定のコンポーネントでのマウスの動きだけをキャプチャしたい場合は、MouseDrag イベントなどで十分です。Matti Virkkunen が言ったように、連続した線が必要な場合は、点から点への補間を行う必要があります。
コンテナとそのサブコンポーネント内で発生するすべてのイベントをキャプチャする必要がある場合は、EventQueues へのアクセスを検討してください。ただし、私はそれについて実際の知識はありませんが、Google で検索すると必要な場所にたどり着く可能性があります。
非常に簡単な解決策の 1 つ (特にペイントの場合) は、提供されている 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)。