我有一个我从父shell创建的自定义swt shell。 我需要设置shell相对于其父组合的位置。但是,因为我在shell上调用setLocation(x,y),所以setLocation(x,y)现在相对于clientArea工作。 有没有办法使shell.setLocation(x,y)相对于PARENT复合NOT ClientArea工作? 。即,即使在屏幕上调整父组合的大小/移动时,自定义Shell也应始终保留在其父组合中。
示例代码段:
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
进行相对调整任何帮助表示赞赏! 感谢。
答案 0 :(得分:0)
我创建了一个片段,您的自定义shell将锚定到主shell中的组件。我把那个组件称为“锚”。将其替换为您的对照。
这里的魔术方法是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随之移动。
答案 1 :(得分:0)
下面的代码获取了实际的相对位置 自定义shell的父级。这需要使用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();
}
});
感谢您的输入