JFace — это доплнительный слой абстракции над графической библиотекой SWT, предоставляющий возможности для разработки графического интерфейса приложения на основе модели MVC(Model View Controller). Основные компоненты JFace включают:
- Viewers — классы для инкапсуляции задач предоставления данных для отображения, их фильтрации, сортировки и т.п.
- Actions and contributions — вводят семантику описания пользовательских действий и того, как они должны быть доступны пользователю.
- Image and font registries — предоставляют классы для управления ресурсами, такими как изображения и шрифты.
- Dialogs and wizards — фреймворк для построения сложного диалогового взаимодействия с пользователем.
- Field assist — предоставляет возможности для реализации вспомогательной функциональности для полей, такой как отображение статуса поля или подсказки о содержимом.
В первой части будет рассмотрено создание простого окна с использованием JFace, добавление к нему меню, статусной строки и панели инструментов.
Уроки Java для начинающих | #23 — GUI Java (Swing JFrame)
Настройка проекта
Для того, чтобы разрабатывать графические приложения с использованием JFace в Eclipse, необходимо подключить jar-файлы SWT и JFace.
- В случае, если в Eclipse установлено PDE, то это можно сделать, указав в настройках проекта использовать библиотеку SWT, и поставить галочку для поддержки JFace.
- Если же PDE не установлен, то необходимо подключить jar-файлы к проекту вручную. Найти их можно в директории plugins эклипса, называются они org.eclipse.swt_*.jar и org.eclipse.jface_*.jar
Создание окна
Окно приложения в JFace наследуется от класса ApplicationWindow, предоставляющего возможности для создания меню, панелей управления и строки статуса.
Простейший вариант создания окна приведен в следующем примере:
import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.widgets.Display; public class MainWindow extends ApplicationWindow < public static void main(String[] args) < MainWindow window = new MainWindow(); // Создаем наше окно window.setBlockOnOpen( true ); // Устанавливаем флаг — ждать закрытия окна window.open(); // Открываем окно Display.getCurrent().dispose(); // Освобождаем ресурсы >public MainWindow() < super( null ); // Вызываем конструктор родительского класса >>
Создание содержимого окна
Для того, чтобы создать какое-то содержимое окна, необходимо переопределить метод Control createContents( Composite parent ) класса ApplicationWindow. Метод должен возвращать компонент, который будет являться содержимым окна.
В этом же методе можно установить и заголовок окна, вызвав метод setText( String text ) шелла, доступного по вызову getShell()
В этом примере таким компонентом будет просто метка белого цвета, в реальных приложениях таким компонентом является какой-нибудь композит.
protected Control createContents( Composite parent ) < getShell().setText(«My window»); // Устанавливаем заголовок окна Label lbl = new Label( parent, SWT.NONE ); // Создаем новый элемент, в нашем случае — просто метку lbl.setText( «Window contents» ); // Устанавливаем ей текст lbl.setBackground( new Color( Display.getCurrent(), 255, 255, 255 ) ); // Устанавливаем белый цвет фона return lbl; >
Добавление статусной строки
Добавление к окну приложения статусной строки реализуется не просто, а очень просто. Для этого надо всего-навсего вызвать защищенный метод addStatusBar(). Наверное, наиболее подходящим местом для такого вызова является конструктор окна, или какой-нибудь метод его инициализации.
Сделал Java программу с интерфейсом / Погодное приложение
Для того, чтобы отобразить текст в статусной строке необходимо вызвать метод setStatus( String status ), аргументом которого и является та самая строка, которую необходимо отобразить.
Создание меню
Для создания строки меню в JFace необходимо, вызвать метод addMenuBar(), как и для создания строки статуса.
Но затем необходимо добавить пункты меню на панель. Осуществляется это следующим образом:
- Раздел меню описывается классом MenuManager. В конструкторе ему может быть передана строка — имя раздела, где символ » означает, что следующий за ним символ будет ключом при навигации с помошью клавиши Alt. Добавляется раздел меню на панель с помощью конструкции getMenuBar().add( menu ).
- Пункт меню описывается классом Action. Сам класс является абстрактным, пункт меню должен быть унаследован от него и переопределять метод void run(), в котором размещается код, выполняемый при выборе пункта меню пользователем. На самом деле, метод можно и не переопределять, но тогда, зачем этот пункт меню нужен?=) Имя пункта может быть задано путем передачи в конструктор, или вызовом метода void setText( String text ). После создания пункт меню добавляется в раздел вызовом метода add у объекта раздела меню. Например: menu.add( menuItem )
- Подменю создаются очень просто: Необходимо в один раздел меню методом add добавить другой раздел. Вот и все.
В следующем примере мы создаем раздел меню File и один пункт Hello в нем, выбор которого вызывает появление текста в статусной строке окна. Код создания меню я оформил в один метод, который вызывается из конструктора окна:
Создание панели инструментов
Для того, чтобы создать панель инструментов в окне необходимо в конструкторе окна вызвать метод addToolBar( int style ), в который передать стиль компонента панели.
Для доступа к созданной панели используется метод getToolBarManager(). Для добавления действия на панель используется метод add панели, куда передается действие.
В простейшем случае создание панели и добавление на нее кнопки будет выглядеть:
Создание нескольких перемещаемых панелей инструментов
Вместо одной панели инструментов можно создать набор перемещаемых панелей (CoolBar). Для этого необходимо:
- Вместо метода addToolBar вызвать метод addCoolBar
- Для доступа к набору панелей используется метод getCoolBarManager()
- Создать панель инструментов, на которую можно будет добавлять действия. Для этого необходимо создать новый экземпляр класса ToolBarManager, который будет представлять панель и вызвать метод add у CoolBarManager, передав туда панель.
- На созданную панель можно добавлять действия
Пример кода, создающего две плавающие панели:
private void createCoolbar()
Важно! Окно приложение может иметь или одну панель управления или набор перемещаемых, попытка создания и того и другого приведет к ошибке!
Возможные проблемы
Здесь будут описаны некоторые проблемы, с которыми можно столкнуться:
- При добавлении пунктов меню после запуска приложения они не появляются — чтобы изменения меню после создания окна отобразились на нем, необходимо вызвать метод getMenuBarManager().update( true ) — указать обновить панель меню.
Ссылки
Дополнительная информация по JFace может быть найдена по следующим ссылкам:
- Русскоязычная вводная статья на ibm.com
- Цикл англоязычных статей на ibm.com
- Описание API Eclipse — среди прочего там есть и пакеты, относящиеся к SWT и JFace
Источник: www.internet-technologies.ru
Введение в Java FX
Однажды у меня возникла идея, написать небольшое настольное приложение для своих нужд — что-то типа небольшого словаря для изучения иностранных слов — и я начал ломать голову, а как бы мне это сделать? Естественно, первое, что мне пришло в голову — Swing. Все наверняка слышали о Swing . Это библиотека для создания пользовательских, графических интерфейсов. В связи с тем, что наш горячо любимый Oracle еще не полностью отказался от Swing, он не считается устаревшим, и приложения на нем по-прежнему работают. Однако он больше не модернизируется Swing, и ребята из Oracle дали нам понять, что за JavaFX будущее. Да и по сути, JavaFX использует компоненты Swing как поставщика услуг)
Что такое JavaFX?
JavaFX — это по сути инструментарий GUI для Java. Здесь будет небольшое отступление, и мы вспомним, что такое GUI : Graphical user interface — графический интерфейс пользователя — это разновидность пользовательского интерфейса, в котором все элементы (кнопки, меню, пиктограммы, списки) представленные пользователю на дисплее, выполнены в виде картинок, графики.
В отличие от интерфейса командной строки, в GUI у пользователя есть произвольный доступ к видимым объектам с помощью устройств ввода. Зачастую элементы интерфейса реализованы в виде метафор и отображают их свойства и назначение для облегчение понимания пользователя. JavaFX нацелен на создание игр и настольных приложений на Java.
По сути им заменят Swing из-за предложенного нового инструмента GUI для Java. Также, он позволяет нам стилизовать файлы компоновки GUI (XML) и сделать их элегантнее с помощью CSS, подобно тому, как мы привыкли к сетевым приложениям. JavaFX дополнительно работает с интегрированной 3D-графикой, а также аудио, видео и встроенными сетевыми приложениями в единый инструментарий GUI… Он прост в освоении и хорошо оптимизирован. Он поддерживает множество операционных систем, а также Windows, UNIX системы и Mac OS.
Особенности JavaFX:
JavaFX: примеры использования
Создаем обычный класс с методом main (точку входа):
Тут наш класс наследуется от javafx.application.Application (который у нас из коробки Бугага). В мейне вызываем статический метод Application — launch() для запуска нашего окна. Также у нас наша idea будет ругаться, на то что мы не реализовали метод Application — start , что мы в итоге и делаем. Для чего он нужен? А для того, чтобы можно было управлять свойствами (функционалом нашего окна). Для этого у нас юзается входящий аргумент primaryStage , у которого мы вызываем метод show , чтобы можно было увидеть запускаемое окно в main . Давайте немного заполним наш метод start :
public void start(Stage primaryStage) throws Exception < primaryStage.setTitle(«Dogs application»); primaryStage.setWidth(500); primaryStage.setHeight(400); InputStream iconStream = getClass().getResourceAsStream(«/images/someImage.png»); Image image = new Image(iconStream); primaryStage.getIcons().add(image); Button button = new Button(«WOF WOF . ‘»); button.setOnAction(e -< < Alert alert = new Alert(Alert.AlertType.INFORMATION, «WOF WOF WOF. «); alert.showAndWait(); >); Scene primaryScene = new Scene(button); primaryStage.setScene(primaryScene); primaryStage.show(); >
Итак, что мы тут видим?
Пробежимся построчно: 2 — задаем название самого окна(stage) 3,4 — задаем его размеры 6,7 — задаем путь читающего потока к файлу (иконке) 8 — создаем файл как объект Image, который связан с реальным файлом потоком передаваемым в конструкторе 9 — задаем иконку в верхнюю панель окна 11 — создаем объект кнопки 13-16 — задаем реакцию при нажатии кнопки 17 — создаем сцену, куда помещаем нашу кнопку 18 — сцену помещаем на наше общее окно 20 — задаем флаг видимости для окна И как результат получаем небольшое окошко, для приветствия наших любимых песелей:
Полностью писать весь код для отображения приложения, не есть хорошо, нужно его как-то делить, дабы сделать его более понятным (графические составляющие в одни корзинки, логику в — другие). И тут на сцену выходит xml…. О боже мой, xml? Именно. А конкретно — используется его специфичная реализация для JavaFX — FXML, в которой мы определяем графические компоненты приложения и их свойства (там всякие размеры и прочее), а после — связываем с контроллером, который и помогает управлять логикой. Давайте рассмотрим пример такого xml:
function buttonClicked()
2 — язык сценариев который мы юзаем 4-6 — импортируемые данные 8-9 Vbox — контейнер, который размещает подкомпоненты в одной строке. 11 — выводим некий текст 13 — кнопка при нажатии которой мы юзаем метод описанный в скрипте на 15-18 строке Тут должен быть код вызова данного xml файла в методе start , но сейчас это не столь важно, и мы это опустим (ниже будет пример подтягивания данного файла). Итак, xml — это, конечно, хорошо (да не очень), вручную писать их очень заморочено, разве это не прошлый век?
Знакомство с JavaFX SceneBuilder
Именно на этом моменте на сцену выходит (барабанная дробь) — SceneBuilder В JavaFX Scene Builder — это инструмент, с помощью которого мы можем конструировать наши окна в виде графического интерфейса и после их сохранять, и эта программа на основании результата будет конструировать xml файлы, которые мы будем подтягивать в нашем приложении. Как-то так выглядит интерфейс данного fmxl-строителя:
Небольшое отступление. JavaFX уроки
Детали установки я упущу, и подробное изучение данного инструмента тоже. Это темы, которые стоит изучить дополнительно. Поэтому всё же оставлю пару интересных ссылочек на JavaFX уроки: раз (онлайн учебник по JavaFX) и два (еще один неплохой туториал). Давайте немного пробежимся по небольшому примеру, который я набросал.
В итоге у меня получилось, что-то вроде: (такое себе окошко для учёта собак) При выборе песеля и нажатии кнопки Delete, собака удаляется из нашего списка. При выборе четырехлапого друга и изменении его полей, а после нажатии кнопки Edit — инфа собачки обновляется. Когда нажимаем кнопку New, вылазит окошко для создания записи новой собаки (для начала её имени): После жмем Save и заполняем в первом окне остальные её поля, а затем жмём кнопку Edit для сохранения. Звучит несложно, верно? Давайте посмотрим, как это будем выглядеть у нас в приложении Java. Для начала, я просто оставлю здесь xml макеты для двух этих окон сгенерированных в SceneBuilder : Первое(базовое):
Второе(для создания новых пёсиков):
public class AppFX extends Application < private Stage primaryStage; private AnchorPane rootLayout; private ObservableListlistDog = FXCollections.observableArrayList(); public AppFX()
Тут мы видим конструктор, который будет заполнять наши начальные данные (которые храним в специальном листе — ObservableList).
Ничего особенного — main и реализация start() , запускающая приложение:
public void showBaseWindow() < try < FXMLLoader loader = new FXMLLoader(); loader.setLocation(AppFX.class.getResource(«/maket/rootWindow.fxml»)); rootLayout = loader.load(); Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); InputStream iconStream = getClass().getResourceAsStream(«/icons/someImage.png»); Image image = new Image(iconStream); primaryStage.getIcons().add(image); BaseController controller = loader.getController(); controller.setAppFX(this); primaryStage.show(); >catch (IOException e) < e.printStackTrace(); >>
Итак, тут мы видим метод, который мы собственно и запускаем в start() , а именно — задающий настройки нашего базового окна. Таких как на xml макете в ресурсах: задание ему иконки, связывание его с конкретным контроллером, и задание контроллеру ссылки на this класс)
public void showCreateWindow(Dog dog) < try < FXMLLoader loader = new FXMLLoader(); loader.setLocation(AppFX.class.getResource(«/maket/new.fxml»)); AnchorPane page = loader.load(); Stage dialogStage = new Stage(); dialogStage.setTitle(«Wow Wow Wow»); dialogStage.initModality(Modality.WINDOW_MODAL); dialogStage.initOwner(primaryStage); dialogStage.setScene(new Scene(page)); CreateController controller = loader.getController(); controller.setDialogStage(dialogStage); controller.setDog(dog); dialogStage.showAndWait(); >catch (IOException e) < e.printStackTrace(); >> >
public class Dog < private StringProperty name; private StringProperty breed; private IntegerProperty age; private StringProperty city; private IntegerProperty levelOfTraining; public Dog(String name, String breed, int age, String city, int levelOfTraining) < this.name = new SimpleStringProperty(name); this.breed = new SimpleStringProperty(breed); this.age = new SimpleIntegerProperty(age); this.city = new SimpleStringProperty(city); this.levelOfTraining = new SimpleIntegerProperty(levelOfTraining); >public Dog() < name = new SimpleStringProperty(); breed = null; age = null; city = null; levelOfTraining = null; >>
public void setAppFX(AppFX appFX) < this.appFX = appFX; dogs.setItems(appFX.getListDog()); >private void showDogsInformation(Dog dog) < if (dog != null) < name.setText(dog.getName() != null ? dog.getName().getValue() : null); breed.setText(dog.getBreed() != null ? dog.getBreed().getValue() : null); age.setText(dog.getAge() != null ? String.valueOf(dog.getAge().get()) : null); city.setText(dog.getCity() != null ? dog.getCity().getValue() : null); levelOfTraining.setText(dog.getLevelOfTraining() != null ? String.valueOf(dog.getLevelOfTraining().get()) : null); >else < name.setText(«»); breed.setText(«»); age.setText(«»); city.setText(«»); levelOfTraining.setText(«»); >>
В первом методе мы видим задание внутренней ссылки на класс, реализующий Application (для того, чтобы можно было дёрнуть его метод для вызова второго окна), и задание начального списка для отображения. Второй же проверяет, есть ли определенные данные текущей собаки, и на основании этого задаёт текстовые поля:
Тут мы видим связь с текстовым полем в окне, обработки кнопок Save и Cancel, которые так или иначе закрывают окно. Как вы видите, для большего удобства в своем небольшом приложении я юзал Lombok, иначе код очень бы сильно разросся бы, и в свой обзор я никак бы его не вместил.
На этом сегодня у меня, пожалуй, всё. Сегодня мы вкратце ознакомились с базовыми понятиями и примером использования JavaFX, и можем строить небольшие настольные приложения (используя дополнительную инфу, которой, благо, в интернетах полно). А с вас, в свою, очередь лайк))
Источник: javarush.com
Как написать программу на java с интерфейсом
Комментарии
Популярные По порядку
Не удалось загрузить комментарии.
ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ
ТОП-10 лучших книг по Java для программистов
Не имеет значения, хотите вы улучшить скилл или только собираетесь начать изучение, здесь вы найдете лучшие книги по Java для программистов.
6 книг по Java для программистов любого уровня
Подборка материалов по Java. Если вы изучаете его, то обязательно найдете для себя что-то полезное и неважно на какой стадии изучения вы находитесь.
Изучаем алгоритмы: полезные книги, веб-сайты, онлайн-курсы и видеоматериалы
В этой подборке представлен список книг, веб-сайтов и онлайн-курсов, дающих понимание как простых, так и продвинутых алгоритмов.
Источник: proglib.io