JavaFX: Про коня и лань
… В одну телегу впрячь неможно
Коня и трепетную лань.
— А.С. Пушкин, «Полтава».
JavaFX — язык из семейства Java, но все-таки не Java. JavaFX предназначена для быстрого создания пользовательских интерфейсов и хотя некоторые фрагменты «чистого» java-кода в такие программы можно помещать непосредственно, делается это весьма специфическим образом. Если же вам нужна мощная бизнес-логика — извольте пользоваться классическими средствами и обращаться к ним через специальные «прокладки». Как же вызывать возможности Java из JavaFX?
По этому поводу в Интернете не особо много материалов, но кое-что есть. Мне эти решения показались какими-то темноватыми и я сварганил свое, вполне работоспособное и достаточно элегантное.
Во-первых, создаем Java-класс с необходимой бизнес-логикой. Делаем его абстрактным, предусматривая метод, в котором впоследствии позволим «порезвиться» JavaFX-компоненте:
public interface SomeClassable{
public Object someMethod(int x, int y);
void createFx();
}
abstract class SomeClass implements SomeClassable{
public Object someMethod(int x, int y){
// Bla-bla-bla
return hz;
}
}
Теперь внутри fx-исходника (он должен в данном случае называться Main.fx и принадлежать к тому же пакету, что и вышеприведенный код), пишем
class Main extends SomeClass{
public function createFx(): Void{
Stage{
width: 640
height: 480
title: "Заголовок окна"
scene: Scene{
content: [
Circle{translateX: 25 translateY: 25 radius: 20},
// Bla-bla-bla
Button{text: "Рассчитать" translateX: 420 width: 150 translateY: 100 font: Font{size: 16}},
]
}
}
}
}
Тут много чего вложено, но суть в том, что объект Stage, отвечающий за вывод пользовательского интерфейса на экран, находится именно здесь.
Теперь добавляем точку входа в программу (функция run()):
var main = Main{};
function run(){
main.createFx();
}
Чтобы вызвать метод класса SomeClass достаточно такой строки:
var superPuperObjectFromJava = main.someMethod(1, 2);
З.Ы. Перечитал еще раз и подумал: а нельзя ли обойтись без интерфейса? Оказывается, можно:
abstract class SomeClass implements SomeClassable{
public Object someMethod(int x, int y){
// Bla-bla-bla
return hz;
}
abstract void createFx();
}
Только в fx-коде нужно добавит слово override:
class Main extends SomeClass{
public override function createFx(): Void{
...
// дальше как в первом случае.
Комментарии (5)
RSS свернуть / развернутьSergei_T
yababay
Sergei_T
yababay
Markony
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.