Среда JFace в Eclipse предоставляет множество стандартных и полезных диалогов и платформу для создания пользовательских диалогов и мастеров. Когда стандартные диалоги кажутся слишком простыми для вашего плагина или разработки RCP , можно расширить стандартные диалоги в соответствии с их собственными потребностями. Цель этой статьи — предоставить пример ориентированного подхода к диалогам и подробно рассмотреть все часто используемые диалоги. Я надеюсь, что эта статья станет ориентиром для многих разработчиков, чтобы получить обзор диалогов.
Диалоги — это модальные компоненты пользовательского интерфейса, которые выполняют некоторые задачи взаимодействия с пользователем. Традиционно диалоги используются для ввода простого ввода, выбора из списка, выбора нескольких узлов в дереве, для информирования об успехе / неудаче в операции, для ввода подтверждений от пользователя и т. Д.
Eclipse предоставляет стандартные диалоги из двух разных сред, SWT предоставляет очень простые диалоги, такие как FontDialog , ColorDialog , DirectoryDialog , FileDialog и FontDialog . Эти диалоги SWT выходят из SWT, поскольку они очень простые и имеют тесную связь с ОС. Все эти диалоги доступны из пакета org.eclipse.swt.widgets из org.eclipse.swt. <Платформа> .jar.
JFace предоставляет разработчикам различные диалоги для расширения или непосредственного использования. Интересно посмотреть на различные диалоги, предоставляемые JFace, и я бы оставил использование вашего воображения и контекста. Остальная часть этой статьи в основном код, снимки экрана и меньше текстового описания. Я старался держать коротко, сладко и просто.
FileDialog
Это диалог SWT, но его стоит упомянуть в общей концепции диалогов.
«Экземпляры этого класса позволяют пользователю перемещаться по файловой системе и выбирать или вводить имя файла. Примечание. Может быть указан только один из стилей SAVE и OPEN. ВАЖНО: Этот класс предназначен для использования только в подклассах <em> </ em> в рамках реализации SWT. «
FileDialog fsd = new FileDialog(shell);
fsd.setFilterExtensions(new String[] {"*.jpg"});
fsd.setText("Select My JPG Files...");
fsd.open();
Информационные Диалоги
Эти диалоги используются для информирования пользователя о каком-либо событии и выполнения некоторых необходимых действий. В этой категории есть разные диалоги.
ErrorDialog
« Диалог для отображения одной или нескольких ошибок пользователю, как содержится в объекте IStatus. Если ошибка содержит дополнительную подробную информацию, то автоматически предоставляется кнопка« Подробности », которая показывает или скрывает средство просмотра сведений об ошибках при нажатии пользователем ».
ErrorDialog.openError(shell, "This is Error Title", "This is Error Message", status);
MessageDialog
« Диалог для отображения сообщений пользователю. Этот конкретный класс диалога может быть создан как есть, или, при необходимости, дополнительно разделен на подклассы ».
MessageDialog.openInformation(shell, "Message Dialog Information", "This is some random Message");
MessageDialog.openQuestion(shell, "This is a Tricky Question", "Do you know whats 2 + 3 = ?");
InputDialog
Этот диалог используется для очень общей парадигмы для обработки некоторого ввода от пользователя. Обычно его не рекомендуется использовать для ввода сложных данных и для большого количества полей ввода.
final InputDialog id = new InputDialog(shell, "Enter Your Name", "Your name will be entered in Nobel Prize List.", "<Your Name>", new IInputValidator() {
public String isValid(String newText) {
if (newText.contains("x")) {
return "Your name can not have \"x\" character.";
}
return null;
}
});
id.open();
PrinterDialog
« Экземпляры этого класса позволяют пользователю выбирать принтер и различные параметры, связанные с печатью, перед началом задания на печать. ВАЖНО! Этот класс предназначен для использования в подклассах только в реализации SWT ».
PrintDialog pd = new PrintDialog(shell);
pd.open();
ProgressMonitorDialog
Это очень важный компонент Dialog, который будет использовать большинство приложений. Этот диалог используется для представления любой трудоемкой задачи или для предоставления пользователю задачи длительного рабочего пространства. Должны быть предприняты надлежащие меры, чтобы показать пользователю точную информацию о прогрессе.
ProgressMonitorDialog pmd = new ProgressMonitorDialog(shell);
pmd.setCancelable(true);
pmd.create();
try {
pmd.run(true, true, new MySimpleRunnable());
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
TitleAreaDialog
« Диалог, который имеет область заголовка для отображения заголовка и изображения, а также общую область для отображения описания, сообщения или сообщения об ошибке. Этот класс диалога может быть разделен на подклассы ».
Это класс, который я часто использую для диалогов типа «О MyCompany».
public class TitleAreaDialog_Ex extends TitleAreaDialog {
public TitleAreaDialog_Ex(Shell parentShell) {
super(parentShell);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite contents = new Composite(parent, SWT.NONE);
contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
setTitle("This is the Title Area Title");
setMessage("This is the Title Area Description");
new Label(contents, SWT.LEFT).setText("Hello World in Content Area");
Dialog.applyDialogFont(parent);
Point defaultMargins = LayoutConstants.getMargins();
GridLayoutFactory.fillDefaults().numColumns(2).margins(defaultMargins.x, defaultMargins.y).generateLayout(contents);
return contents;
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Title Area Shell");
shell.pack();
TitleAreaDialog taDialog = new TitleAreaDialog_Ex(shell);
taDialog.setTitleAreaColor(new RGB(0, 100, 200));
taDialog.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
ElementListSelectionDialog
« Класс для выбора элементов из списка элементов. »
ElementListSelectionDialog listDialog = new ElementListSelectionDialog(shell,new LabelProvider());
listDialog.setTitle("This is Element List Title");
listDialog.setMessage("This is Element List Message");
listDialog.setElements(list.toArray());
listDialog.open();
ListDialog
« Диалог, который запрашивает один элемент из списка элементов. Использует IStructuredContentProvider для предоставления элементов и ILabelProvider для предоставления их меток ».
ListDialog ld = new ListDialog(shell);
ld.setAddCancelButton(true);
ld.setContentProvider(new ArrayContentProvider());
ld.setLabelProvider(new LabelProvider());
ld.setInput(list.toArray());
ld.setInitialSelections(list.toArray());
ld.setTitle("Select # of Nobel Prize Nominations :");
ld.open();
TwoPaneElementSelector
« Диалоговое окно выбора списка с двумя панелями. Дублированные записи будут сложены вместе и отображаются в нижней панели (квалификатор) ».
TwoPaneElementSelector elementSelector = new TwoPaneElementSelector(shell, labelProvider, labelProvider);
elementSelector.setTitle("Two Pane Element Selector");
elementSelector.setElements(new String[] {"One", "Two", "Three"});
elementSelector.setLowerListLabel("Lower List");
elementSelector.setUpperListLabel("Upper List");
elementSelector.setMultipleSelection(true);
elementSelector.setInitialSelections(new String[] {"One", "Two"});
elementSelector.open();
Список выбораDialog
« Стандартный диалог, который запрашивает список выборов от пользователя. Этот класс настроен с произвольной моделью данных, представленной объектами поставщика содержимого и метки. Метод getResult возвращает выбранные элементы ».
ListSelectionDialog lsd = new ListSelectionDialog(window.getShell(), list, new ArrayContentProvider(), new LabelProvider(), "ListSelectionDialog Message");
lsd.setInitialSelections(list.toArray());
lsd.setTitle("Select # of Nobel Prize Nominations :");
lsd.open();
ElementTreeSelectionDialog
« Класс диалога для выбора элементов из древовидной структуры ».
ElementTreeSelectionDialog treeDialog = new ElementTreeSelectionDialog(window.getShell(), new MyLabelProvider(), new MyTreeContentProvider());
treeDialog.setInput(nullFamily);
treeDialog.setInitialSelections(nullFamily.getChildren());
treeDialog.setInitialElementSelections(list);
treeDialog.setInitialSelection("One");
treeDialog.setTitle("ElementTreeSelection Title");
treeDialog.setMessage("ElementTreeSelectionDialog Message");
treeDialog.open();
CheckedTreeSelectionDialog
«Класс диалога для выбора элементов из древовидной структуры»
CheckedTreeSelectionDialog checkedtreeDialog = new CheckedTreeSelectionDialog(window.getShell(), new MyLabelProvider(), new MyTreeContentProvider());
checkedtreeDialog.setInput(nullFamily);
checkedtreeDialog.setInitialSelections(nullFamily.getChildren());
checkedtreeDialog.setInitialElementSelections(list);
checkedtreeDialog.setInitialSelection("One");
checkedtreeDialog.setTitle("ElementTreeSelection Title");
checkedtreeDialog.setMessage("ElementTreeSelectionDialog Message");
checkedtreeDialog.open();
Некоторые заметки
- YesNoCancelListSelectionDialog устарела в версии 3.3 Eclipse.
- Расширения и настройки продукта RCP могут быть выполнены через AboutDialogs.
- AboutDialog
- AboutFeaturesDialog
- AboutPluginsDialog
- AboutSystemDialog
Примечание. Над диалогами находятся внутренние диалоги, а не API. Они упоминаются только для справки.
- PrintDialog предназначен для подклассов клиентами и использует его для определения принтеров и других параметров для задания на печать.
- SaveAsDialog не доступен в Eclipse 3.3
Вывод
Диалоги — отличный способ представить простые данные и получить пользовательский ввод. Очень важно понимать несколько диалогов, предоставляемых JFace, и использовать их соответствующим образом.