1

次のコードを使用して新しいシェルを作成すると:

shell = new Shell( Display.getDefault(), SWT.RESIZE);        

次に、これにより、タイトルバーまたは最小化/最大化ボタンのないシェルが得られます。これは私が望んでいるものです。このウィンドウのサイズを任意のサイズに変更できます。これはうまく機能します。しかし、問題は、ウィンドウがその場所に固定されており、ドラッグしても移動できないことです。

または のいずれSWT.CASCADEかを追加するSWT.CLOSEと、タイトル バーと閉じるボタンが表示されますが、これは望ましくありませんが、ウィンドウのサイズを変更できるサイズに制限があります。限界。

閉じるボタン/タイトルバーなしでウィンドウを移動可能にするにはどうすればよいですか? SWT にそれを行うためのネイティブな方法がない場合、マウス ドラッグ イベントをリッスンし、シェルの場所を手動で設定することで、それを行うことができますか? もしそうなら、マウスの動きからマウス座標を取得するにはどうすればよいですか?

助けていただければ幸いです。ありがとう!

4

2 に答える 2

5

独自のリスナーを使用する必要があります。以下のコードが役立ちます:-

public class Demo {

    static Boolean blnMouseDown=false;
    static int xPos=0;
    static int yPos=0;

    public static void main(final String[] args) {
        Display display=new Display();
        final Shell shell = new Shell( Display.getDefault(), SWT.RESIZE); 
        shell.open();

        shell.addMouseListener(new MouseListener() {

            @Override
            public void mouseUp(MouseEvent arg0) {
                // TODO Auto-generated method stub
                blnMouseDown=false;
            }

            @Override
            public void mouseDown(MouseEvent e) {
                // TODO Auto-generated method stub
                blnMouseDown=true;
                xPos=e.x;
                yPos=e.y;
            }

            @Override
            public void mouseDoubleClick(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }
        });
        shell.addMouseMoveListener(new MouseMoveListener() {

            @Override
            public void mouseMove(MouseEvent e) {
                // TODO Auto-generated method stub
                if(blnMouseDown){

                    shell.setLocation(shell.getLocation().x+(e.x-xPos),shell.getLocation().y+(e.y-yPos));
                }
            }
        });

        while (!shell.isDisposed()) {
          if (!display.readAndDispatch()) {
            display.sleep();
          }
        }  
        display.close();
    }

}
于 2013-09-23T08:19:45.787 に答える
3

これは私の実装です:

/**
 * ユーザーがタイトルなしでシェルを移動できるようにするクラス。
 *
 * @author ローラン・ミュラー
 * @バージョン 1.0
 */
public class MoveShellListener はリスナーを実装します {

    /*
     * 親シェル
     */
    プライベート最終シェルの親。

    /*
     * マウスダウンの場所
     */
    プライベート ポイント ptMouseDown;

    /**
     * このクラスの新しいインスタンスを作成します。
     *
     * @param 親
     * 扱うシェル。
     */
    public MoveShellListener(最終的なシェルの親) {
        if (親 == null) {
            SWT.error(SWT.ERROR_NULL_ARGUMENT);
        }
        if (parent.isDisposed()) {
            SWT.error(SWT.ERROR_WIDGET_DISPOSED);
        }

        // リスナーをコピーして追加
        this.parent = 親;
        addControl(親);
    }

    /**
     * 指定されたコントロールをリッスン コントロールのリストに追加します。与えられた場合
     * コントロールは {@link Composite} のインスタンスであり、子コントロールは
     ※も追加。
     *
     * @param コントロール
     * 追加するコントロール。
     */
    public void addControl(最終コントロール コントロール) {
        // コントロールをチェック
        if (isDisposed(control) || control.getShell() != 親) {
            戻る;
        }

        // リスナーを追加
        control.addListener(SWT.MouseDown, this);
        control.addListener(SWT.MouseUp, this);
        control.addListener(SWT.MouseMove, this);

        // 子供
        if (複合インスタンスの制御) {
            final Control[] children = ((複合) コントロール).getChildren();
            for (final Control child : children) {
                addControl(子);
            }
        }
    }

    /**
     * 指定されたコントロールをリッスン コントロールのリストに追加します。次のいずれかの場合
     * 指定されたコントロールは {@link Composite} のインスタンスであり、子コントロールは
     ※も追加。
     *
     * @param コントロール
     * 追加するコントロール。
     */
    public void addControls(最終コントロール... コントロール) {
        if (コントロール != null) {
            for (最終的なコントロール コントロール : コントロール) {
                addControl(コントロール);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @オーバーライド
    public void handleEvent(最終イベント e) {
        スイッチ (e.type) {
        ケース SWT.MouseDown:
            onMouseDown(e);
            壊す;
        ケース SWT.MouseUp:
            onMouseUp(e);
            壊す;
        ケース SWT.MouseMove:
            onMouseMove(e);
            壊す;
        }
    }

    /**
     * 指定されたコントロールをリッスン コントロールのリストから削除します。与えられた場合
     * コントロールは {@link Composite} のインスタンスであり、子コントロールは
     ※こちらも削除。
     *
     * @param コントロール
     * 削除するコントロール。
     */
    public void removeControl(最終コントロール コントロール) {
        // コントロールをチェック
        if (コントロール == 親 || isDisposed(コントロール)
                || control.getShell() != 親) {
            戻る;
        }

        // リスナーを削除
        control.removeListener(SWT.MouseDown, this);
        control.removeListener(SWT.MouseUp, this);
        control.removeListener(SWT.MouseMove, this);

        // 子供
        if (複合インスタンスの制御) {
            final Control[] children = ((複合) コントロール).getChildren();
            for (final Control child : children) {
                removeControl(子);
            }
        }
    }

    /**
     * 指定されたコントロールをリッスン コントロールのリストから削除します。いずれかの場合
     * 指定されたコントロールは {@link Composite} のインスタンスであり、子
     * コントロールも削除されます。
     *
     * @param コントロール
     * 削除するコントロール。
     */
    public void removeControls(最終的なコントロール... コントロール) {
        if (コントロール != null) {
            for (最終的なコントロール コントロール : コントロール) {
                removeControl(コントロール);
            }
        }
    }

    /**
     * 指定されたコントロールがnullまたは破棄されているかどうかを確認します。
     *
     * @param コントロール
     * 確認するコントロール。
     *trueコントロールがnullorの場合は @return
     ※処分しました。
     */
    private boolean isDisposed(最終コントロール コントロール) {
        コントロールを返す == null || control.isDisposed();
    }

    /**
     * マウス ダウン イベントを処理します。
     *
     * @param e
     * イベントデータ。
     */
    private void onMouseDown(最終イベント e) {
        if (e.button == 1) {
            ptMouseDown = new Point(ex, ey);
        }
    }

    /**
     * マウス移動イベントを処理します。
     *
     * @param e
     * イベントデータ。
     */
    private void onMouseMove(最終イベント e) {
        if (ptMouseDown != null) {
            最終的なポイントの場所 = parent.getLocation();
            location.x += ex - ptMouseDown.x;
            location.y += ey - ptMouseDown.y;
            親.setLocation(場所);
        }
    }

    /**
     * マウス アップ イベントを処理します。
     *
     * @param e
     * イベントデータ。
     */
    private void onMouseUp(最終イベント e) {
        ptMouseDown = null;
    }
}
于 2014-11-20T08:13:06.653 に答える