3

私はSwingJFrameに取り組んでおり、プログラムの機能の1つは、マウスのスクロールホイールを使用してウィンドウ内の画像を拡大縮小することでした。JFrame自体のMouseWheelListenerとして追加されるMouseAdapterを実装しました。

/**
 * Handles scroll wheel activity.
 */
private MouseAdapter wheelListener = new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int notches = e.getWheelRotation();
        System.out.println(notches);
        while (notches > 0) {
            controller.zoomIn();
            notches--;
        }
        while (notches < 0) {
            controller.zoomOut();
            notches++;
        }
    }
};

そして、JFrameコンストラクターでは:

public MainFrame() {
    ...
    addMouseWheelListener(wheelListener);
    ...
}

私が抱えている問題は、スクロールホイールを回すときに、「クリック」ごとにイベントが2回トリガーされることです。同様の問題を抱えている人を見つけることができませんでした。

メソッドを入れif(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { ... }て、mouseWheelMoved2つの異なるタイプのイベントが発生しているかどうかを確認しようとしましたが、どちらも発生していますWHEEL_UNIT_SCROLL's

また、イベントのソースを印刷して、別のウィンドウ/ペインからのものかどうかを確認しようとしましたが、どちらもメインのJFrameウィンドウからのものです。

誰かが、私が1つを取得する必要があるのに、なぜ2つのイベントを取得するのかを知っているか、見つけることができますか?

編集:ホイールリスナーの追加セクションに間違った行を入れてください、ごめんなさい。編集:いくつかのテストの後、私.hashCode()は2つのユニークなものがあることを確認するために使用することができましたMouseWheelEvents。MouseAdapterがどういうわけか2回追加されているのではないかと思います。MainFrameのコンストラクターに追加し、そこで1回だけ発生することを確認しました。

4

1 に答える 1

1

e.consume()を追加すると、この問題が解決します。

private MouseAdapter wheelListener = new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        e.consume() // avoid the event to be triggred twice
        int notches = e.getWheelRotation();
        System.out.println(notches);
        while (notches > 0) {
            controller.zoomIn();
            notches--;
        }
        while (notches < 0) {
            controller.zoomOut();
            notches++;
        }
    }
};
于 2014-12-03T22:49:48.273 に答える