gpt4 book ai didi

java - shell.setLocation(x, y) 相对于父区域而不是客户区域

转载 作者:行者123 更新时间:2023-12-01 04:12:24 26 4
gpt4 key购买 nike

我有一个从父 shell 创建的自定义 swt shell。我需要设置外壳相对于其父组合的位置。但是,因为我在 shell 上调用 setLocation(x, y),所以 setLocation(x,y) 现在相对于 clientArea 起作用。有没有办法使 shell.setLocation(x,y) 相对于 PARENT 组合而不是 clientArea 工作? 。即,即使父复合 Material 在屏幕上调整大小/移动,自定义 Shell 也应始终保留在其父复合 Material 内。

示例代码片段:

 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

感谢任何帮助!谢谢。

最佳答案

我创建了一个代码片段,其中您的自定义 shell 锚定到主 shell 中的组件。我将该组件称为“ anchor ”。将其替换为您的控件。

这里的神奇方法是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();
}

请注意,我还在自定义 shell 上添加了监听器,以确保它永远不会移动。当父 shell 移动时,自定义 shell 也会随之移动。

关于java - shell.setLocation(x, y) 相对于父区域而不是客户区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19794136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com