如何以无模式方式在Eclipse插件中使用JFace FileDialog?

时间:2009-03-06 04:52:20

标签: eclipse swt

我正在编写一个Eclipse插件,为了响应某些操作,我很有兴趣开始一系列操作(在一个单独的工作中)。其中一个操作是请求用户提供一个文件名,我正在尝试使用JFace JDialog。

但是,我不清楚如何以无模式的方式做到这一点;例如,我在哪里获得显示器和外壳?当开发人员可以在对话框中编辑内容时,如何确保UI继续工作?

2 个答案:

答案 0 :(得分:4)

可能你可以看到Eclipse本身是如何做到的:

<强> FindAndReplaceDialog.java

 /**
  * Creates a new dialog with the given shell as parent.
  * @param parentShell the parent shell
  */
 public FindReplaceDialog(Shell parentShell) {
     super(parentShell);

     fParentShell= null;

     [...]

     readConfiguration();

     setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE | SWT.RESIZE);
     setBlockOnOpen(false);
 }

 /**
  * Returns this dialog's parent shell.
  * @return the dialog's parent shell
  */
 public Shell getParentShell() {
     return super.getParentShell();
 }

/**
 * Sets the parent shell of this dialog to be the given shell.
 *
 * @param shell the new parent shell
 */
public void setParentShell(Shell shell) {
    if (shell != fParentShell) {

        if (fParentShell != null)
            fParentShell.removeShellListener(fActivationListener);

        fParentShell= shell;
        fParentShell.addShellListener(fActivationListener);
    }

    fActiveShell= shell;
}

它根据Dialog的焦点管理其父shell。

 /**
  * Updates the find replace dialog on activation changes.
  */
 class ActivationListener extends ShellAdapter {
     /*
      * @see ShellListener#shellActivated(ShellEvent)
      */
     public void shellActivated(ShellEvent e) {
         fActiveShell= (Shell)e.widget;
         updateButtonState();

         if (fGiveFocusToFindField && getShell() == fActiveShell && 
               okToUse(fFindField))
             fFindField.setFocus();

     }

     /*
      * @see ShellListener#shellDeactivated(ShellEvent)
      */
     public void shellDeactivated(ShellEvent e) {
         fGiveFocusToFindField= false;

         storeSettings();

         [...]

         fActiveShell= null;
         updateButtonState();
     }
 }

ShellAdapterShellListener接口描述的方法提供了默认实现,它提供了处理Shell状态变化的方法。

答案 1 :(得分:0)

重要的是样式值应包含SWT.MODELESS。

样式是你应该看的SWT中最重要的事情之一,因为你只能因为样式值而控制和初始化很多东西。