JavaJavaFX Доза первая

Как и обещал пишу первый топик посвященный изучению javaFX, немного с запозданием ввиду отсутствия времени, но лучше поздно чем никогда.
Итак начем. В первой части я расскажу откуда скачать, как установить, и напишем и разберем наш первый как водится helloWorld.

Пункт первый он же Установка всего необходимого
В зависимости от того какой IDE вы пользуетесь будут разные варианты. Я расскажу о двух вариантах, на примере двух самый популярных IDE для разработки Java это NetBeans и Eclipse.
Для NetBeans все ужасно просто, есть специальная сборка для JavaFX в которой уже есть все необходимое для работы. Скачать ее можно отсюда.
C Eclipse дело обстоит несколько хуже. Можно скачать плагин добавив репозиторий http://javafx.com/downloads/eclipse-plugin, затем нужно скачать саму SDK это можно сделать по той же ссылке что и для NetBeans, прописать путь к SDK в переменной окружения JAVAFX_HOME и после этих махинаций все должно работать, но увы, как я понял, этот плагин не адаптирован для javafx 1.2 поэтому весь ваш код будет подчеркиваться как сплошная ошибка, соответственно не будет работать авто комплит, но при этом будет нормально компилироваться. Я не стал углубляться в решении этой проблемы(пару часов погуглил, попробовал несколько плагинов, и нашел на форумах много аналогичных нерешенных проблем), а просто перешел на NetBeans (хотя конечно Eclipse для меня приятнее и привычнее). Ну я думаю на этом с первым пунктом разобрались.

Идем далее Пишем HelloWorld

После создания нового пустого проекта, в NetBeans уже будет создан некий начальный код, но его мы удалим и начнем писать с нуля.

для начала объявим две переменные которые будут у нас отвечать за размеры окна:
var height = 500;
var widght = 500;

Сразу оговорюсь, что тип переменной var определяется в момент компиляции, а не во время исполнения. Создадим так же переменную
var textField =  TextBox {
                text
: ""
                columns
: 19
                selectOnFocus
: true
           
};
var welcomeText: Text;
var animation = TranslateTransition {
    duration
: 2s
    node
: bind welcomeText
    toY
: -350
    interpolator
: Interpolator.LINEAR
   
}

textField переменная хранит в себе объект TextBox — аналогичный JTextField. Мы задаем ей параметры: text — это содержимое текстового поля, colums — количество «ячеек»(видимых символов), a selectOnFocus это значит что не важно в фокусе этот элемент или нет при получении фокуса его содержимое будет выделено. welcomeText переменная типа Text мы ее определим позже, a переменная adnimation — экземпляр класса, который отвечает за анимацию поля welcomeText (мы написали node: bind welcomeText). Далее переходим к основному. понимаем следующую частичку кода:
Stage {
    title
: "Hello world!!!"
    width
: widght
    resizable
: false
    height
: height
Stage — это высокоуровневый контейнер для всех объектов которые есть в скрипте. В нашем случае (я запускаю скрипт как desktop application) это будет обычное окно. Так же мы задаем размеры этому окну и запрещаем менять размер.
Построение всего графического интерфейса в javafx постоено в виде дерева. Корнем его является класс Scene. У него есть большое количество атрибутов, но мы пока что воспользуемся только некоторыми.
scene: Scene {
        fill
:LinearGradient
       
{
                startX
: 0.5
                startY
: 0.0
                endX
: 0.5
                endY
: 1.0
                stops
: [
                   
Stop {
                        color
: Color.DARKGRAY
                        offset
: 0.0
                   
},
                   
Stop {
                        color
: Color.BLACK
                        offset
: 0.5
                   
},
               
]
       
}
       

fill — атрибут который отвечает за отрисовку фона. Мы его в данном случае заполним градиентом от светло-серого до черного сверху вниз (startX и startY это координаты начала отрисовки градиента, endX и endY его конца, принимают значения в процентах т.е. 0.5 — 50% т.е. середина).
Перейдем к самому интересному — добавлению контента.
content:
       
Group {

            layoutY
: 30
            content
: [
               
HBox {
                    width
: 500
                    spacing
: 10
                    vpos
: VPos.CENTER
                    hpos
: HPos.CENTER
                    content
: [
                   
Label{
                        graphicVPos
: VPos.CENTER
                        text
: "Enter your name"
                        textFill
: Color.WHITE
                        effect
: Reflection {
                                fraction
: 0.75
                                topOffset
: 0.0
                                topOpacity
: 0.5
                                bottomOpacity
: 0.0
                           
}
                   
},
                    textField
,
                   
Button {
                        text
: "Go go go"
                        action
: function()
                       
{
                           
if(textField.text!="")
                           
{
                                welcomeText
.content = "Hi,{textField.text}!\n"
                               
"Приветстую тебя вот тут, я решил написать \n"
                               
"Много всякой лабуды, чтобы все таки можно \n"
                               
"Было забить пустое место на экране....\n";
                                welcomeText
.visible = true;
                                animation
.playFromStart();
                           
}
                           
else
                           
{
                                welcomeText
.visible = false;
                                animation
.stop();
                           
}
                       
}
                   
}
               
]
           
},
            welcomeText
= Text{
                layoutX
: 50
                layoutY
: 450
                content
: ""
                font
: Font.font("Sergio",20)
                fill
: Color.LIGHTCYAN
           
}
         
]
   
}

Мы создаем группу отображения (Group — это ветвь которая содержит несколько дочерних ветвей). Атрибуты layoutX и layoutY — задаю абсолютное положение относительно левого верхнего угла родительского объекта. В javafx существует 2 layout menager`а это VBox и HBox которые соответственно отвечают за вертикальную и горизонтальную компоновку объектов. Мы делим всю рабочую область на 2 части.
В верхнюю мы добавляем Label (аналог обычного JLabel, к нему мы для красоты сопоставляем эффект Reflection — отражение), за ним идет наш textField и кнопка, которая будет обрабатывать собитие нажатия. Нижняя панель по-умолчанию пуста. После нажатия кнопки мы берем то что уже написано в textField (методом textField.text), добавляем это в сумбурный бредовый текст welcome.content = «some_text {inserted_text} some_other_text», далее делаем этот объект видимым и запускаем анимацию (animation.playFromStart()). Конечно все это дело заключаем в if-else блок, чтобы проверить на пустоту ввода (если в поле ничего не ввели, то выключаем анимацию и скрываем поле). Должно получиться что-то вроде такого


чтобы можно было легко скопипастить и проверить если не верите то я приведу полный листинг этого простенького кода.
package olp;

import javafx.animation.transition.TranslateTransition;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.control.Label;
import javafx.scene.control.TextBox;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.paint.Color;
import javafx.scene.layout.HBox;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.effect.Reflection;
import javafx.animation.Interpolator;
import javafx.scene.Group;

var height = 500;
var widght = 500;
var welcomeText: Text;


var textField =  TextBox {
                text
: ""
                columns
: 19
                selectOnFocus
: true
           
};

var animation = TranslateTransition {
    duration
: 2s
    node
: bind welcomeText
    toY
: -350
    interpolator
: Interpolator.LINEAR
   
}

Stage {
    title
: "Hello world!!!"
    width
: widght
    height
: height
    resizable
: false

    scene
: Scene {
        fill
:LinearGradient
       
{
                startX
: 0.5
                startY
: 0.0
                endX
: 0.5
                endY
: 1.0
                stops
: [
                   
Stop {
                        color
: Color.DARKGRAY
                        offset
: 0.0
                   
},
                   
Stop {
                        color
: Color.BLACK
                        offset
: 0.5
                   
},
               
]
       
}
        content
:
       
Group {

            layoutY
: 30
            content
: [
               
HBox {
                    width
: 500
                    spacing
: 10
                    vpos
: VPos.CENTER
                    hpos
: HPos.CENTER
                    content
: [
                   
Label{
                        graphicVPos
: VPos.CENTER
                        text
: "Enter your name"
                        textFill
: Color.WHITE
                        effect
: Reflection {
                                fraction
: 0.75
                                topOffset
: 0.0
                                topOpacity
: 0.5
                                bottomOpacity
: 0.0
                           
}
                   
},
                    textField
,
                   
Button {
                        text
: "Go go go"
                        action
: function()
                       
{
                           
if(textField.text!="")
                           
{
                                welcomeText
.content = "Hi,{textField.text}!\n"
                               
"Приветстую тебя вот тут, я решил написать \n"
                               
"Много всякой лабуды, чтобы все таки можно \n"
                               
"Было забить пустое место на экране....\n";
                                welcomeText
.visible = true;
                                animation
.playFromStart();
                           
}
                           
else
                           
{
                                welcomeText
.visible = false;
                                animation
.stop();
                           
}
                       
}
                   
}
               
]
           
},
            welcomeText
= Text{
                layoutX
: 50
                layoutY
: 450
                content
: ""
                font
: Font.font("Sergio",20)
                fill
: Color.LIGHTCYAN
                visible
: true
           
}
         
]
   
}
}

}


Топик получился немного сумбурным, прошу за это прощения, уже почти 5 давно не спал и голова уже не соображает. Надеюсь это кому-то когда-нибудь пригодится. Спасибо за внимание, жду критики.

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

Статья хорошая. Только я в начале ожидал увидеть плюсы использования JavaFX.
в следующей статье исправлюсь… сделаю часть номер ноль)
И правда, обзора нехватает…
В блокнот. Очень ясное и лаконичное руководство. Спасибо. )
а вам спасибо за прочтение и за книжки;)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.