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{
  ...
  // дальше как в первом случае.
  • +6
  • 23 апреля 2010, 13:39
  • yababay

Комментарии (5)

RSS свернуть / развернуть
+
0
Почему нет во втором фрагменте вызова методов класса sameClass?
avatar

Sergei_T

  • 23 апреля 2010, 13:44
+
0
Чтобы не затемнять пример. Если понадобятся эти методы — их легко вызвать так:


var superPuperObjectfromJava = main.someMethod(1, 2);
avatar

yababay

  • 23 апреля 2010, 13:51
+
0
Просто так навскидку непонятно
avatar

Sergei_T

  • 23 апреля 2010, 13:52
+
0
ОК, добавил пару строк.
avatar

yababay

  • 23 апреля 2010, 16:02
+
0
Как всегда Красиво, но бесы кроются в мелочах !
avatar

Markony

  • 23 апреля 2010, 20:05

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.