8

親シェルとしてSWTウィザードページがあります。ボタンをクリックして別のシェルを作成するために、次のコードを記述しています。

Shell permissionSetShell = new Shell(Display.getCurrent().getActiveShell(), SWT.CENTER|SWT.DIALOG_TRIM|SWT.APPLICATION_MODAL);
permissionSetShell.setText(PropertyClass.getPropertyLabel(QTLConstants.PERMISSION_SET_COLUMN_LABEL));

// Add shell to the center of parent wizard
permissionSetShell.setLayout(componentsRenderer.createGridLayout(1, false, 0, 5, 0, 0));    
Monitor primary = Display.getCurrent().getPrimaryMonitor ();
Rectangle bounds = primary.getBounds ();
Rectangle rect = Display.getCurrent().getActiveShell().getBounds ();
int x = bounds.x + (bounds.width - rect.width) / 2;
int y = bounds.y + (bounds.height - rect.height)/2;              
permissionSetShell.setLocation (x, y);

しかし、子シェルは、このシェルが親シェルであるSWTウィザードの中央に配置されていないことを意味するのでなぜですか?

4

4 に答える 4

7
Rectangle screenSize = display.getPrimaryMonitor().getBounds();
shell.setLocation((screenSize.width - shell.getBounds().width) / 2, (screenSize.height - shell.getBounds().height) / 2);
于 2013-10-18T05:59:41.067 に答える
3

ダイアログまたは子コンポーネントを作成している場合、ディスプレイにプライマリ モニターを要求する代わりに getParent を使用して、ウィンドウが複数のモニター セットアップの現在の画面の中央に配置されるようにすることができます。

Rectangle parentSize = getParent().getBounds();
Rectangle shellSize = shell.getBounds();
int locationX = (parentSize.width - shellSize.width)/2+parentSize.x;
int locationY = (parentSize.height - shellSize.height)/2+parentSize.y;
shell.setLocation(new Point(locationX, locationY));
于 2016-12-03T21:14:24.807 に答える
0

私はちょうどこの同じ問題に遭遇しました。私が得た解決策は少し異なります。これは、同じ問題を抱えている他の人を助けるかもしれません。コンテキストはシェル (hoverShell) で、親 (シェル) の上に数秒間ホバーしてメッセージを表示します。

    private void displayMessage(Shell shell, String message) {
      Shell hoverShell = new Shell(shell, SWT.ON_TOP);
      hoverShell.setLayout(new FillLayout());
      Label messageLabel = new Label(hoverShell, SWT.NONE);
      messageLabel.setText(message);
      Point shellLocation = shell.getLocation();
      hoverShell.pack();
      hoverShell.setLocation(shellLocation.x + (shell.getSize().x / 2) - (hoverShell.getSize().x / 2), shellLocation.y + 40);
      hoverShell.open();
      Display.getDefault().timerExec(2000, new Runnable() {

        @Override
        public void run() {
            hoverShell.dispose();
        }
    });
}

簡単に言えば、これは次の式です。

子の位置.x = 親の位置.x + .5*(親の幅.x) - .5*(子の幅.x)

あなたがyを望むなら、それは私が信じているのとまったく同じです。ウィンドウの上端が計算されるかどうかによって異なります。

于 2019-11-21T10:12:13.527 に答える