Что меня особенно вымораживает в Java - это невозможность создавать нормальные интерфейсы. Я не спец, мне нужен просто инструмент для написания костылей. Желательно, чтобы кроссплатформенный и именно RAD. Слепил окошко, покидал контролы и вперед. В Java все не так. SWT, Swing и прочие радости мало того, что позволяют вывихнуть мозг, так еще и попутно требуют написания горы мусора, описывая интерфейс и, в конечном итоге, требуемой быстроты и гибкости разработки не дают. Да, я писал эту стыдобу, на всем этом перечисленном. Интерфейсом назвать нельзя. То ли дело QT, например. Но не будем отвлекаться. Потребовалось в очередной раз написать костыль с формочками.
Решил попробовать новомодный Java FX и заодно записать последовательность, поскольку писать приходится редко и правильная забывается.
Надо сказать, что это, по сравнению с предыдущими геморройниками, таки просто прорыв. За исключением того, конечно, что под винду у вас все будет адски тормозить (среда разработки). Итак, лучшей средой разработки я, хоть и не разбираюсь в этом, считаю IntelliJ Idea. Соответственно к ней потребуется Scene Builder. Его можно взять у Gluon, но, поскольку наши рукожопы блокировщики перекрыли доступ по IP, я пользовался тем, что можно скачать с Oracle (там старая версия), впрочем, она нормально работает, по крайней мере без углубления в подробности.
Сразу после установки Scene Builder не забудьте его указать в Settings > Languages & Frameworks > Java FX, под виндой необходимо показать прямо на бинарник.
При создании проекта указываете Java FX, после чего создадутся три закладки: Main.java, Controller.java, sample.fxml
В последнем файлике - сама форма с компонентами, в предпоследнем - контроллер, т.е. то, что описывает взаимодействие кодом.
На fxml правой кнопкой и вызывайте Scene Builder (есть возможность переключиться на закладку, но мне этот вариант не понравился).
Появится вполне себе логичное окошко для создания формочек. Накидайте что-нибудь, не забывая выравнивать в разделе Layout справа. Есть даже нечто вроде margin в HTML. Я, соответственно, бросил Label и Button. Кстати, компоненты удобно искать в соответствующем окошке, а кидать можно не только в окно справа, но и вниз.
Дальше пришлось гуглить, как же связать форму, собственно, с контроллером. Делается это в разделе Documents
нашел не сразу... Собственно, дальше встал затык, как объявить Label в коде, как объект. Тоже долго мучился. Выяснилось, что для того, чтобы объекты видели форму и наоборот, необходимо их объявлять с приставкой @FXML, т.е.
Код:
@FXML
private Label TitleLabel;
в классе контроллера объявляет эту Label, а потом надо пойти опять в Scene Builder и привязать объявленную к объекту в поле fx:id.
Дальше встала задача связать факт нажатия кнопки с каким-то кодом в контроллере. Для начала написал этот самый код, контроллер стал выглядеть так
Код:
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class Controller {
@FXML
private Label TitleLabel;
@FXML
private void handleDeletePerson() {
System.out.println("PRINT TO CONSOLE");
TitleLabel.setText("LABEL OWNED!");
}
}
и идти опять в Scene Builder, чтобы эту процедуру привязать к кнопке
Обратите внимание, что Label много где присутствует, импортировать надо из javafx. Собственно, все, минимальное достигнуто. После запуска появится формочка (ее, кстати, в меню Preview или по Ctrl-P в самом билдере можно посмотреть). Можно будет нажать кнопочку, текст Label поменяется и в консоли текст выскочит... По сравнению с тем, что было в Delphi - вообще страшный бубен, но по сравнению с SWT или Swing - очень даже человеческое...