我正在编写一个Eclipse插件,为了响应某些操作,我很有兴趣开始一系列操作(在一个单独的工作中)。其中一个操作是请求用户提供一个文件名,我正在尝试使用JFace JDialog。
但是,我不清楚如何以无模式的方式做到这一点;例如,我在哪里获得显示器和外壳?当开发人员可以在对话框中编辑内容时,如何确保UI继续工作?
答案 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();
}
}
ShellAdapter
为ShellListener
接口描述的方法提供了默认实现,它提供了处理Shell
状态变化的方法。
答案 1 :(得分:0)
重要的是样式值应包含SWT.MODELESS。
样式是你应该看的SWT中最重要的事情之一,因为你只能因为样式值而控制和初始化很多东西。