- PR -

Glass pane上にペイントしたダイアログのボタンの位置の取得方法

投稿者投稿内容
未記入
会議室デビュー日: 2007/01/26
投稿数: 18
投稿日時: 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上にペイントされたダイアログについて使えるのでしょうか?どのようにしてボタン上の座標であるか判断すればよいか分かりません。どのようにしてボタン上を判断するのでしょうか?

よろしくお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-27 14:09
引用:

未記入さんの書き込み (2007-02-27 13:54) より:
以下のGlassPaneDemoを参考にして、Glass Pane上にJDialogをペイントして擬似的にダイアログを作ろうと思っているのですが、ペイントされたダイアログのボタンがマウスクリックされたかどうかを判断するのに悩まされています。



JButtonにaddMouserListenerするのが普通ですが、
そうできない理由がなにかあるのですか?
未記入
会議室デビュー日: 2007/01/26
投稿数: 18
投稿日時: 2007-02-27 14:37
説明足らずでした。JOptionPane#createDialogで返したJDialogの"OK"ボタン(JButton)についての座標位置です。BufferedImage,Graphics2Dを駆使してGlass Paneに描画させてます。デモの赤いスポットがそのままダイアログになってます。描画前にリスナーを追加すると、Glass Pane上のマウスイベントをキャッチするのでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-27 15:28
引用:

未記入さんの書き込み (2007-02-27 14:37) より:
BufferedImage,Graphics2Dを駆使してGlass Paneに描画させてます。デモの赤いスポットがそのままダイアログになってます。描画前にリスナーを追加すると、Glass Pane上のマウスイベントをキャッチするのでしょうか?



Glass Pane上にボタンを置いた場合、というのがこの質問のポイントなのかな。
GlassPaneといっても実態はただのComponentなわけで。

RootPaneContainer.setGlassPaneにはこう書かれています。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/swing/RootPaneContainer.html
引用:

glassPane を可視に設定することで、すべてのキーボードおよびマウス入力を一時的にグラブできます。



その描画処理はJButtonのpaintComponent()をオーバーライドして実装しているのでしょう?
どういったコンポーネントツリーが構成されているのかは分かりませんが、
該当のJButtonが正しいJComponentとしての実装であり、
途中のコンテナがイベントを遮断していない限り、イベントは伝わると思います。
未記入
会議室デビュー日: 2007/01/26
投稿数: 18
投稿日時: 2007-02-28 09:47
引用:

Glass Pane上にボタンを置いた場合、というのがこの質問のポイントなのかな。


この箇所がうまく伝わっていないような気がしましたので、Glass Paneの描画箇所のコードを一部抜粋します。

コード:
public class MyGlassPane extends JComponent
{
    private Point _mouseClickedPoint;
    private JDialog _dialogue;
    private BufferedImage _buffer;

//	.
//	.
//	.

    public void createDialog(String message)
    {
        // Set a dialogue to be displayed.
        JOptionPane pane = 
            new JOptionPane(message,JOptionPane.WARNING_MESSAGE,
                    JOptionPane.DEFAULT_OPTION,null,null,null);
        _dialogue = pane.createDialog(null, "Message!!!");
        
        Dimension size = _dialogue.getSize();
        
        _buffer = 
            new BufferedImage(
                    size.width, size.height,BufferedImage.TYPE_INT_ARGB);
        
        Graphics2D g2d = _buffer.createGraphics();
        g2d.setClip(0, 0, size.width, size.height);
        for (int i = 0; i < _dialogue.getComponentCount(); i++)
        {
            _dialogue.getComponent(i).paint(g2d);
        }        
        g2d.dispose();
        
        repaint();
    }

    protected void paintComponent(Graphics g)
    {
        if (_mouseClickedPoint != null)
        {
            g.setColor(Color.DARK_GRAY.brighter());
            
            Rectangle b = new Rectangle(_mouseClickedPoint.x,
                                        _mouseClickedPoint.y,
                                        _buffer.getWidth(),
                                        _buffer.getHeight());
            g.drawImage(_buffer, b.x, b.y, null);
            g.drawRect(b.x, b.y, b.width, b.height);            
        }
    }

//	.
//	.
//	.

}



Glass Pane上に描いたJDialogに含まれるボタンのことです。これがGlass Pane上でのクリックなどで発生したマウスイベントから、座標がボタン上にあるかを知りたいわけですが、描画前にダイアログを分解してボタンにリスナーを追加するということですか??
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-28 13:45
引用:

未記入さんの書き込み (2007-02-28 09:47) より:
Glass Pane上に描いたJDialogに含まれるボタンのことです。これがGlass Pane上でのクリックなどで発生したマウスイベントから、座標がボタン上にあるかを知りたいわけですが、描画前にダイアログを分解してボタンにリスナーを追加するということですか??



なぜ、JDialogをJDialogとしてshow()しないのでしょう?
JDialogのpaint()だけを利用して独自に描画する意図はなんですか?
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2007-02-28 14:06
ずいぶん奇怪なことをしていますね...。

引用:

未記入さんの書き込み (2007-02-28 09:47) より:
コード:
        for (int i = 0; i < _dialogue.getComponentCount(); i++)
        {
            _dialogue.getComponent(i).paint(g2d);
        }        





getComponent()でどのようなコンポーネントが得られるかは知りませんけど、
ボタンが得られた場合にその座標情報などを保存しておかないと、後で「ある座標がボタンの上かどうか」なんて判断できませんよね。
未記入
会議室デビュー日: 2007/01/26
投稿数: 18
投稿日時: 2007-03-01 17:31
フォーカスをJDialogに移したくないからです。奇怪ですが、描画だけで擬似的にダイアログをGlass Pane上に実現できるか知りたかったのですが、少し難しそうですね。

勉強になりました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)