gpt4 book ai didi

Java 将一个对话框停靠在另一个对话框上

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

我同时创建了两个对话框。现在我想将一个对话框停靠到另一个对话框。因此,如果其中一个被移动,另一个也会被移动。

我尝试过实现一个监听器,但是不起作用,因为他会在对话框关闭后被调用。

public class DialogOne extends TitleAreaDialog {

public DialogOne(Shell parentShell) {
super(parentShell);
}

@Override
public void create() {
super.create();
setTitle("Dialog One");
}

@Override
public int open() {
Display.getCurrent().asyncExec(new Runnable() {

@Override
public void run() {
DialogTwo dialogTwo = new DialogTwo(getShell());
dialogTwo.open();
dialogTwo.addControlListener(new ControlAdapter() {

@Override
public void controlMoved(ControlEvent e) {
System.out.println("Moved");

}
});

}
});
return super.open();
}

@Override
protected void setShellStyle(int newShellStyle) {
super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE);
setBlockOnOpen(false);
}
}

public class DialogTwo extends TitleAreaDialog {

private Composite composite;

public DialogTwo(Shell parentShell) {
super(parentShell);
}

@Override
public void create() {
super.create();
setTitle("Dialog Two");
}

@Override
protected void setShellStyle(int newShellStyle) {
super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE);
setBlockOnOpen(false);
}

@Override
protected Control createDialogArea(Composite parent) {
composite = (Composite) super.createDialogArea(parent);
return composite;
}

public void addControlListener(ControlListener listener) {
composite.addControlListener(listener);
}
}

那么我如何才能从第二个对话框中获取边界并将第一个对话框重新定位到第二个对话框旁边。当第二个将被移动时也是如此。

最佳答案

我找到了一种方法来满足我的要求。我发现,我可以首先使用 dialogTwo.create() 创建对话框。所以我可以在对话框打开之前做任何我想做的事情。在本例中,我添加了 shell 并添加了一个控制监听器。

public class DialogOne extends TitleAreaDialog {

private Shell dialogShell;

public DialogOne(Shell parentShell) {
super(parentShell);
}


@Override
public void create() {
super.create();
setTitle("Dialog One");
getShell().addControlListener(new ControlAdapter() {


@Override
public void controlMoved(ControlEvent controlevent) {
moveDialog(DialogOne.this.getShell());

}
});
}


@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
createSecondDialog();
return composite;
}

private void createSecondDialog() {
final DialogTwo dialogTwo = new DialogTwo(getShell());
dialogTwo.create();
dialogShell = dialogTwo.getShell();
dialogShell.addControlListener(new ControlAdapter() {


@Override
public void controlMoved(ControlEvent e) {
moveDialog(dialogShell);

}
});

Display.getCurrent().asyncExec(new Runnable() {


@Override
public void run() {

dialogTwo.open();
}
});

}

protected void moveDialog(Shell shell) {
Rectangle rightBounds;
int dialogBorder = 10;
if (shell.equals(getShell())) {
rightBounds = shell.getBounds();
dialogShell.setLocation(rightBounds.width + rightBounds.x + dialogBorder, rightBounds.y);
} else {
rightBounds = dialogShell.getBounds();
Rectangle leftBounds = getShell().getBounds();
getShell().setLocation(
rightBounds.x - leftBounds.width - dialogBorder,
rightBounds.y);
}
}


@Override
protected void setShellStyle(int newShellStyle) {
super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE);
setBlockOnOpen(false);
}
}

关于Java 将一个对话框停靠在另一个对话框上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381963/

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