1

簡単に言えば、私が望むのは、モーダル JDialog によってブロックされたウィンドウでマウス クリックをキャッチすることです。

以下に例を示します。

public class BlockedFrameTest
{
    public static void main ( final String[] args )
    {
        Toolkit.getDefaultToolkit ().addAWTEventListener ( new AWTEventListener ()
        {
            @Override
            public void eventDispatched ( final AWTEvent event )
            {
                if ( event instanceof MouseEvent )
                {
                    System.out.println ( event );
                }
            }
        }, AWTEvent.MOUSE_EVENT_MASK );

        final JFrame frame = new JFrame ( "Frame" );
        frame.add ( new JLabel ( "Content" )
        {
            {
                setBorder ( BorderFactory.createEmptyBorder ( 100, 100, 100, 100 ) );
            }
        } );
        frame.pack ();
        frame.setLocationRelativeTo ( null );
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.setVisible ( true );

        final JDialog dialog = new JDialog ( frame, "Dialog" );
        dialog.setModal ( true );
        dialog.add ( new JLabel ( "Content" )
        {
            {
                setBorder ( BorderFactory.createEmptyBorder ( 50, 50, 50, 50 ) );
            }
        } );
        dialog.pack ();
        dialog.setLocationRelativeTo ( frame );
        dialog.setVisible ( true );
    }
}

出力ログの例を見ると、JDialog が開かれたときに JFrame からのイベントが渡されないことがわかります (例で追加されたグローバル AWT イベント リスナーにも渡されます)。

ブロックされたJFrameのクリックをキャッチする方法はありますか?
または、ブロックされた何かがユーザーによって「触れられた」ときに、少なくともイベントをキャッチしますか?

これが必要な理由は、そのようなイベントが発生したときにカスタム装飾された JDialog ブリックを作成するためです。

4

2 に答える 2

1

JDialogモーダルの場合はできないと思いますが、次のトリックを使用できますFocusListener

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Example {
    public static void main(final String[] args) {

        final JFrame frame = new JFrame("Frame");
        final JDialog dialog = new JDialog(frame, "Dialog");
        frame.add(new JLabel("Content") {
            {
                setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
            }
        });
        frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent arg0) {
                System.out.println("frame pressed");
                System.out.println("dialog focused " + dialog.isFocused());
                System.out.println("frame focused " + frame.isFocused());
                super.mousePressed(arg0);
            }
        });
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);


        dialog.add(new JLabel("Content") {
            {
                setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
            }
        });
        dialog.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent arg0) {
                super.focusLost(arg0);
                dialog.requestFocus();
            }
        });
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }
}

そして出力:

frame pressed
dialog focused true
frame focused false
于 2013-12-20T11:53:59.993 に答える
1

たぶんこれが役立ちます:

Javaでウィンドウ外のマウスクリック座標を取得する方法

Swing の領域を離れてネイティブ GUI ドメインに入るので、少し難しいです。

于 2013-12-20T11:49:33.033 に答える