Java Tutorial/SWT/Dialog

Материал из Java эксперт
Перейти к: навигация, поиск

17. Create a dialog shell

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DialogShellCreate {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    
    Shell dialog = new Shell(shell);
    dialog.setText("Dialog");
    dialog.setSize(200, 200);
    dialog.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}





17. Create a dialog shell and position it

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DialogShellPositionIt {
  public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    Shell dialog = new Shell(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    Point pt = display.getCursorLocation();
    dialog.setLocation(pt.x, pt.y);
    dialog.setText("Dialog Shell");
    dialog.setSize(100, 100);
    dialog.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}





17. Create a dialog shell (prompt for a value)

/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
//package org.eclipse.swt.snippets;
/*
 * Shell example snippet: create a dialog shell (prompt for a value)
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class DialogShellPromptValue {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.pack();
    
    final boolean[] result = new boolean[1];
    final Shell dialog = new Shell(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    dialog.setLayout(new RowLayout());
    final Button ok = new Button(dialog, SWT.PUSH);
    ok.setText("OK");
    Button cancel = new Button(dialog, SWT.PUSH);
    cancel.setText("Cancel");
    Listener listener = new Listener() {
      public void handleEvent(Event event) {
        result[0] = event.widget == ok;
        dialog.close();
      }
    };
    ok.addListener(SWT.Selection, listener);
    cancel.addListener(SWT.Selection, listener);
    dialog.pack();
    dialog.open();
    System.out.println("Prompt ...");
    while (!dialog.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    System.out.println("Result: " + result[0]);
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}





17. Create your own dialog classes which allows users to input a String

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class InputDialog extends Dialog {
  private String message;
  private String input;
  public InputDialog(Shell parent) {
    this(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
  }
  public InputDialog(Shell parent, int style) {
    super(parent, style);
    setText("Input Dialog");
    setMessage("Please enter a value:");
  }
  public String getMessage() {
    return message;
  }
  public void setMessage(String message) {
    this.message = message;
  }
  public String getInput() {
    return input;
  }
  public void setInput(String input) {
    this.input = input;
  }
  public String open() {
    Shell shell = new Shell(getParent(), getStyle());
    shell.setText(getText());
    createContents(shell);
    shell.pack();
    shell.open();
    Display display = getParent().getDisplay();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    return input;
  }
  private void createContents(final Shell shell) {
    shell.setLayout(new GridLayout(2, true));
    Label label = new Label(shell, SWT.NONE);
    label.setText(message);
    GridData data = new GridData();
    data.horizontalSpan = 2;
    label.setLayoutData(data);
    final Text text = new Text(shell, SWT.BORDER);
    data = new GridData(GridData.FILL_HORIZONTAL);
    data.horizontalSpan = 2;
    text.setLayoutData(data);
    Button ok = new Button(shell, SWT.PUSH);
    ok.setText("OK");
    data = new GridData(GridData.FILL_HORIZONTAL);
    ok.setLayoutData(data);
    ok.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        input = text.getText();
        shell.close();
      }
    });
    Button cancel = new Button(shell, SWT.PUSH);
    cancel.setText("Cancel");
    data = new GridData(GridData.FILL_HORIZONTAL);
    cancel.setLayoutData(data);
    cancel.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event) {
        input = null;
        shell.close();
      }
    });
    shell.setDefaultButton(ok);
  }
}
public class CustomInputDialog {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    InputDialog dlg = new InputDialog(shell);
    String input = dlg.open();
    if (input != null) {
      // User clicked OK; set the text into the label
      System.out.println(input);
    }
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }
}





17. Creating Your Own Dialogs

To create your own dialog, you do the following:

  1. Subclass org.eclipse.swt.widgets.Dialog.
  2. Implement a method named open() that returns an object appropriate to your dialog"s purpose.
  3. In open(), create the window, create the controls and event handlers (including controls and event handlers to dismiss the dialog), and display the window.
  4. Provide getters and setters for any data.


17. Display an Empty Dialog

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class DialogEmptyDisplay {
  public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
    final Shell dialog =new Shell(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    dialog.setLayout(new RowLayout());
    dialog.pack();
    dialog.open();
    // Move the dialog to the center of the top level shell.
    Rectangle shellBounds = shell.getBounds();
    Point dialogSize = dialog.getSize();
    dialog.setLocation(
      shellBounds.x + (shellBounds.width - dialogSize.x) / 2,
      shellBounds.y + (shellBounds.height - dialogSize.y) / 2);

    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in event queue
        display.sleep();
      }
    }
    display.dispose();
  }
}





17. Prevent escape from closing a dialog

/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
//package org.eclipse.swt.snippets;
/*
 * Shell example snippet: prevent escape from closing a dialog
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class ShellEscapeCloseDialog {
  public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display);
    Button b = new Button(shell, SWT.PUSH);
    b.setText("Open Dialog ...");
    b.pack();
    b.setLocation(10, 10);
    b.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent se) {
        Shell dialog = new Shell(shell, SWT.DIALOG_TRIM);
        dialog.addListener(SWT.Traverse, new Listener() {
          public void handleEvent(Event e) {
            if (e.detail == SWT.TRAVERSE_ESCAPE) {
              e.doit = false;
            }
          }
        });
        dialog.open();
      }
    });
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}





17. Using the Dialogs

  1. The common dialog classes in SWT descend from SWT"s abstract Dialog class (org.eclipse.swt.widgets.Dialog).
  2. A dialog"s parent, which is passed to the constructor, is always a Shell object.

ConstantDescriptionSWT.APPLICATION_MODALModal to the application; input is blocked to other windows in the application.SWT.PRIMARY_MODALModal to the parent window of the dialog; input is blocked to the parent of the dialog only.SWT.SYSTEM_MODALInput is blocked to all other windows of all applications until the dialog is dismissed.SWT.NONEModeless (the default).