- - PR -
Glass pane上にペイントしたダイアログのボタンの位置の取得方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-27 13:54
以下のGlassPaneDemoを参考にして、Glass Pane上にJDialogをペイントして擬似的にダイアログを作ろうと思っているのですが、ペイントされたダイアログのボタンがマウスクリックされたかどうかを判断するのに悩まされています。
http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html Glass PaneでキャッチしたMouseEventからクリックの座標がJButtonにあるか知りたいのですが、SwingUtilities#getDeepestComponentAtがGlass Pane上にペイントされたダイアログについて使えるのでしょうか?どのようにしてボタン上の座標であるか判断すればよいか分かりません。どのようにしてボタン上を判断するのでしょうか? よろしくお願いします。 | ||||||||
|
投稿日時: 2007-02-27 14:09
JButtonにaddMouserListenerするのが普通ですが、 そうできない理由がなにかあるのですか? | ||||||||
|
投稿日時: 2007-02-27 14:37
説明足らずでした。JOptionPane#createDialogで返したJDialogの"OK"ボタン(JButton)についての座標位置です。BufferedImage,Graphics2Dを駆使してGlass Paneに描画させてます。デモの赤いスポットがそのままダイアログになってます。描画前にリスナーを追加すると、Glass Pane上のマウスイベントをキャッチするのでしょうか?
| ||||||||
|
投稿日時: 2007-02-27 15:28
Glass Pane上にボタンを置いた場合、というのがこの質問のポイントなのかな。 GlassPaneといっても実態はただのComponentなわけで。 RootPaneContainer.setGlassPaneにはこう書かれています。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/swing/RootPaneContainer.html
その描画処理はJButtonのpaintComponent()をオーバーライドして実装しているのでしょう? どういったコンポーネントツリーが構成されているのかは分かりませんが、 該当のJButtonが正しいJComponentとしての実装であり、 途中のコンテナがイベントを遮断していない限り、イベントは伝わると思います。 | ||||||||
|
投稿日時: 2007-02-28 09:47
この箇所がうまく伝わっていないような気がしましたので、Glass Paneの描画箇所のコードを一部抜粋します。
Glass Pane上に描いたJDialogに含まれるボタンのことです。これがGlass Pane上でのクリックなどで発生したマウスイベントから、座標がボタン上にあるかを知りたいわけですが、描画前にダイアログを分解してボタンにリスナーを追加するということですか?? | ||||||||
|
投稿日時: 2007-02-28 13:45
なぜ、JDialogをJDialogとしてshow()しないのでしょう? JDialogのpaint()だけを利用して独自に描画する意図はなんですか? | ||||||||
|
投稿日時: 2007-02-28 14:06
ずいぶん奇怪なことをしていますね...。
getComponent()でどのようなコンポーネントが得られるかは知りませんけど、 ボタンが得られた場合にその座標情報などを保存しておかないと、後で「ある座標がボタンの上かどうか」なんて判断できませんよね。 | ||||||||
|
投稿日時: 2007-03-01 17:31
フォーカスをJDialogに移したくないからです。奇怪ですが、描画だけで擬似的にダイアログをGlass Pane上に実現できるか知りたかったのですが、少し難しそうですね。
勉強になりました。 ありがとうございました。 |