gpt4 book ai didi

java - 在 SWT 中,父 shell 和非对话框子 shell 之间通信的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-01 19:18:46 25 4
gpt4 key购买 nike

我有一个用 SWT 编写的大型现有应用程序,我必须对其进行修改。

GUI 包含打开非 Dialog 子 shell 的 shell。

现在,当子 shell 关闭时,我必须更新父 shell 上的信息。

我想象了两种选择:

  1. 将所有子级转换为扩展 Dialog 类。问题是它需要大量重构。
  2. 传递父级逻辑类的引用,以便在关闭子级之前我可以调用父级的方法。我不喜欢这个设计。

如果在父代码中我可以监听子 shell 事件并根据子 shell 上发生的情况采取行动,那就太好了。这是一种可观察模式。我在“SWT:开发人员笔记本”中读到:

No event loop is required for the ChildShell. Why? Because the event loop for the parent shell handles the dispatching of events for all objects opened within the parent. The child remains open until it is closed by the user or until the parent is closed.

我没有在 SWT 中进行过实验,而且例子也很少。那么 SWT 的方法是什么呢?我可以使用父循环来达到这样的目的吗?

谢谢。

最佳答案

我建议您在子 shell 上使用ShellListener。然后您可以重写 shellClosed 方法。

示例

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Test {

private static Text text;

public static void main (String [] args)
{
Display display = new Display ();
final Shell shell = new Shell (display);
shell.setLayout(new GridLayout());
shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
shell.setSize(200, 100);
shell.setText("Parent Shell");

Label label = new Label(shell, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
label.setText("The text from child shell ...");

text = new Text(shell, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

Button openChild = new Button(shell, SWT.PUSH);
openChild.setText("Open Child ...");
openChild.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
openChild(shell);
}
});

shell.open ();

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

private static void openChild(Shell parent)
{
final Shell dialog = new Shell (parent, SWT.DIALOG_TRIM);
dialog.setLayout(new GridLayout());
dialog.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
dialog.setSize(200, 100);
dialog.setText("Child Shell");

Label childLabel = new Label(dialog, SWT.NONE);
childLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
childLabel.setText("Type something here ...");

final Text childText = new Text(dialog, SWT.BORDER);
childText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

Button okButton = new Button (dialog, SWT.PUSH);
okButton.setText ("&OK");
okButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
dialog.close();
}
});


dialog.addShellListener(new ShellListener() {
public void shellIconified(ShellEvent e) {
}
public void shellDeiconified(ShellEvent e) {
}
public void shellDeactivated(ShellEvent e) {
}
public void shellClosed(ShellEvent e) {
if(text != null && !text.isDisposed())
text.setText(childText.getText());
}
public void shellActivated(ShellEvent e) {
}
});


dialog.setDefaultButton (okButton);
dialog.open ();
}
}

注意

您还可以使用DisposeListener,但在这种情况下您不能使用text.setText(childText.getText());(请参阅上面的示例)。要处理此问题,请将文本保存在字符串变量中,然后使用该字符串变量填充父文本框。

关于java - 在 SWT 中,父 shell 和非对话框子 shell 之间通信的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5415167/

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