1

カスタム タイトルバーを作成したいので、ユーザーがシェルのサイズを変更して移動できるようにするコードを作成する必要があります (私は SWT を使用しています)。

a) マウスアップのキャプチャ

b) サイズ変更

    shell.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseDown(final MouseEvent arg0) {
            move=true;
            oldx=arg0.x;
            oldy=arg0.y;
            Display.getDefault().syncExec(new Runnable() {
                @Override
                public void run() {
                    while (move) {
                            shell.setLocation(MouseInfo.getPointerInfo().getLocation().x-oldx, MouseInfo.getPointerInfo().getLocation().y-oldy);
                    }
                }

            });
        }
        @Override
        public void mouseUp(MouseEvent arg0) {
            move=false;
        }
    });

シェルの移動は機能していますが、マウスアップ イベントをキャプチャしません。また、サイズ変更の仕方もわかりません。私が試してみました

shell.setSize(MouseInfo.getPointerInfo().getLocation().x-shell.getBounds().x, MouseInfo.getPointerInfo().getLocation().y-shell.getBounds().y);

しかし、うまくいきません。

4

2 に答える 2

1

あなたの問題は、シェルを移動する while ループが UI スレッドで同期的に実行されていることだと思います。これにより、UI がロックされ、他のイベント (マウスアップを含む) が登録されなくなります。

移動スレッドを別のバックグラウンド スレッドとして実行して、mouseDown呼び出しが戻り、への呼び出しのみをラップできるようにshell.setLocationしてDisplay.getDefault().syncExecください。

于 2012-11-06T16:42:34.530 に答える
1

問題は、イベント #1 (mouseUp) の発火が完了する前に、イベント #2 (mouseDown) の発火を期待していることです。SWT はイベントを一度に 1 つずつ処理します。#2 が実行されないため、#1 の操作を完了するには #2 を起動する必要があります。これはデッドロック状態です。mouseDown イベントに基づいてではなく、マウスの移動に合わせてウィンドウを移動する必要があります。このを見てください。

于 2012-11-06T16:48:10.893 に答える