kaisehのブログ このページをアンテナに追加

2008-06-16

マウスイベントを親コントロールに透過させる

SwingコンポーネントはsetOpaque(false)で背景を透明にできますが、その場合でもマウスイベントはコントロール領域内で捕捉されます。

マウスイベントも透過させたい場合は、以下のようにすれば良いようです。これを応用すれば、不定形のコントロールを作ってオーバーレイさせたりできます。

public class MouseEventManipulator {
    public void delegateMouseEventsToParent(Component c) {
        c.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                passToParent(e);
            }

            public void mouseEntered(MouseEvent e) {
                passToParent(e);
            }

            public void mouseExited(MouseEvent e) {
                passToParent(e);
            }

            public void mousePressed(MouseEvent e) {
                passToParent(e);
            }

            public void mouseReleased(MouseEvent e) {
                passToParent(e);
            }
        });
        c.addMouseMotionListener(new MouseMotionListener() {
            public void mouseDragged(MouseEvent e) {
                passToParent(e);
            }

            public void mouseMoved(MouseEvent e) {
                passToParent(e);
            }
        });
    }

    private void passToParent(MouseEvent e) {
        Component c = (Component) e.getSource();
        Component parent = c.getParent();
        Point p = SwingUtilities.convertPoint(c, e.getPoint(), parent);
        MouseEvent newEvent = new MouseEvent(parent, e.getID(), e.getWhen(),
                e.getModifiers(), p.x, p.y, e.getClickCount(),
                e.isPopupTrigger());
        parent.dispatchEvent(newEvent);
    }
}

ateraiaterai 2008/06/17 01:15 こんばんは。SwingUtilities.convertMouseEvent を使うと少しだけ行数減らせそうです。

kaisehkaiseh 2008/06/17 09:06 そのメソッドの存在は知りませんでした!
ありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kaiseh/20080616/1213612349