В SWT, как лучше всего взаимодействовать между родительской оболочкой и дочерней оболочкой без диалога? - PullRequest
0 голосов
/ 24 марта 2011

У меня есть большое существующее приложение, написанное на SWT, которое я должен изменить.

Графический интерфейс состоит из открытия оболочки без дочерних оболочек Dialog.

Теперь мне нужно обновить информацию о родительской оболочке, когда дочерняя оболочка закрыта.

Я представил два варианта:

  1. Конвертировать все дочерние для расширения класса диалога. Проблема в том, что требуется большой рефакторинг.
  2. Передайте ссылку на родительский класс логики, чтобы перед закрытием потомка я мог вызвать метод родителя. Мне не нравится этот дизайн.

Было бы неплохо, если бы в родительском коде я мог прослушивать события дочерней оболочки и предпринимать действия в зависимости от того, что происходит с дочерней оболочкой. Это своего рода наблюдаемая картина. Я прочитал в «SWT: блокнот разработчика»:

Для ChildShell не требуется цикл обработки событий. Зачем? Поскольку цикл событий для родительской оболочки обрабатывает отправку событий для всех объектов, открытых в родительской оболочке. Дочерний элемент остается открытым до тех пор, пока он не будет закрыт пользователем или пока родительский элемент не будет закрыт.

Я не экспериментировал с SWT, и примеров мало. Так, как SWT способ сделать это? Могу ли я использовать родительский цикл для этой цели?

Спасибо.

1 Ответ

4 голосов
/ 24 марта 2011

Я предлагаю вам использовать 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()); (см. Пример выше).Для этого сохраните текст в строковой переменной, а затем используйте строковую переменную для заполнения родительского текстового поля.

...