1

親シェルから作成したカスタム swt シェルがあります。親コンポジットを基準にしてシェルの位置を設定する必要があります。ただし、シェルで setLocation(x, y) を呼び出しているため、setLocation(x,y) は clientArea に対して相対的に機能するようになりました。shell.setLocation(x,y) を PARENT コンポジット NOT clientArea に対して相対的に機能させる方法はありますか? . つまり、カスタム シェルは、親コンポジットのサイズが変更されたり画面上で移動されたりしても、常に親コンポジット内にとどまる必要があります。

サンプル コード スニペット:

 class CustOmShellTest {
    customShell = new Shell(parent.getShell(), SWT.TOOL | SWT.CLOSE);
        customShell.setLayout(new GridLayout());
        customShell.setBackgroundMode(SWT.INHERIT_FORCE);
        customShell.setSize(300, 400);
        customShell.setLocation(parent.getBounds().x, parent.getBounds().y );

}

new CustOmShellTest(parentOfThisInstanceComposite);

//これは、display に対して相対的に配置されたインスタンスです。//parentOfThisInstanceComposite に対して相対的に配置したい

どんな助けでも大歓迎です!ありがとう。

4

2 に答える 2

0

カスタム シェルがプライマリ シェルのコンポーネントに固定されているスニペットを作成しました。そのコンポーネントを「アンカー」と呼びました。コントロールに置き換えます。

ここでの魔法の方法はControl.toDisplay()であり、位置を維持するには、リスナーのサイズ変更と移動を追加する必要があります。

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout());

    final Label label = new Label(shell, SWT.NONE);
    label.setText("anchor");
    label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));

    final Shell customShell = new Shell(shell, SWT.TOOL | SWT.CLOSE);
    customShell.setLayout(new GridLayout());
    customShell.setBackgroundMode(SWT.INHERIT_FORCE);
    customShell.setSize(300, 400);
    customShell.setVisible(true);

    final Listener listener = new Listener() {
        @Override
        public void handleEvent(Event event) {
            final Rectangle bounds = label.getBounds();
            final Point absoluteLocation = label.toDisplay(bounds.width, bounds.height);
            customShell.setLocation(absoluteLocation);
            if (shell.getMaximized()) {
                display.asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        handleEvent(null);
                    }
                });
            }
        }
    };
    shell.addListener(SWT.Resize, listener);
    shell.addListener(SWT.Deiconify, listener);
    shell.addListener(SWT.Move, listener);
    customShell.addListener(SWT.Move, listener);

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

リスナーが移動しないようにするために、カスタム シェルにもリスナーを追加したことに注意してください。親シェルを移動すると、カスタム シェルも一緒に移動します。

于 2013-11-05T20:31:50.357 に答える
0

以下のコードは、カスタム シェルの実際の親の相対位置を取得します。これは、RESIZE イベントで行う必要がありました。

//parent.toDisplay(parent.getLocation().x , //parent.getLocation().y)

customShell.addListener(SWT.RESIZE, new Listener() {
            public void handleEvent(final Event event) {

customShell.setLocation(parent.toDisplay(parent.getLocation().x ,
                        parent.getLocation().y));                
        customShell.layout();
                parent.layout();
            }
        });

ご意見ありがとうございます

于 2013-11-06T02:24:54.730 に答える