Java FX Artur Dudziński, Bartosz Janiak, Roger Zacharczyk
Plan prezentacji 1.Rich Internet Application a)rozwój b)dostępne narzędzia 2.JavaFX a)charakterystyka b)platformy 3.JavaFX Script 4.Narzędzia JavaFX 5.Składnia 6.Przykłady praktyczne
Rich Internet Application Rok 2001 Cechy aplikacji desktopowej One-screen-application
RIA - rozwój
RIA - cechy Praca w trybie offline Efektywne wykorzystanie łączy Jednoekranowa prezentacja danych Brak przeładowywania strony Dowolna kolejność wprowadzania danych Bogaty interfejs graficzny
Przykłady Virtual Earth MS Popfly Adobe Photoshop Express
Narzędzia Adobe Flex Adobe Flash MXML ActionScript Expression Blend Silverligt WPF XAML + C# / VB.NET Parasoft WebKing testowanie
JavaFX Grudzień 2008 wersja 1.0 Maj 2009 wersja 1.2
JavaFX - cechy Pełna integracja z Java Runtime Zadziała wszędzie tam gdzie znajduje się JRE Skupienie na wizualnej zawartości aplikacji Szybkie tworzenie pełnych wyrazu GUI Bogaty zbiór bibliotek dla grafiki, mediów i web serwisów Wykorzystywanie bibliotek Javy Zalety bibliotek JavaFX połączone z bardzo szeroką funkcjonalnością oferowaną przez Java
Platform Diagram
Nie tylko Desktop JFX Mobile 12 luty 2009 jako część JavaFX 1.1 Integracja z JavaME JavaFX TV Tworzenie aplikacji skierowanych na platformy TV 2009/2010
Liczby W czerwcu 2009 ilość pobrań SKD sięgła 400 000 Obecnie dostępna na 250mln komputerów Na świecie jest 2.6 miliarda(!) urządzeń mobilnych korzystających z Javy W 2008 roku 8 na 10 kupionych urządzeń mobilnych było opartych na technologii Java
JavaFX Script Skryptowy język programowania Sładnia przypominająca JavaScript W pełni zorientowany obiektowo Zawiera bardzo duże ilości efektów graficznych, statycznych i ruchomych Dostępny na zasadach Powszechnej Licencji Publicznej GNU Licencja open-source uzyskana w 2007r.
Designer Developer workflow Wsparcie we współpracy programista projektant, grafik itp. JavaFX pozwala na skupieniu się na kreatywności zamiast na programowaniu Możliwość przygotowania grafik i animacji w programach graficznych a następnie wyeksportowanie ich do formatu JavaFX Script
Narzędzia JavaFX (1) Netbeans IDE 6.5.1 for JavaFX Zawiera JavaFX SDK oraz wiele przykładowych aplikacji JavaFX Netbeans Plugin
Narzędzia JavaFX (2) Inne środowiska programistyczne Wymagane JavaFX SDK zawierające kompilator, biblioteki uruchomieniowe, przykłady, emulator przenośnych urządzeń Eclipse - Plugin o wolnym kodzie
Narzędzia JavaFX (3) JavaFX Production Suite: pakiety narzędzi i pluginów Photoshop CS3, Illustrator CS3 JavaFX Media Factory: konwertowanie grafiki wektorowej (SVG) do JavaFX Script
Składnia Java FX Deklarowanie zmiennych Typy zmiennych Funkcje Sekwencje Operatory Wyrażenia Klasy i obiekty Tworzenia aplikacji graficznych
Deklarowanie zmiennych def numone = 100; def numtwo = 2; var result; Type inference
Typy zmiennych String Number i Integer Boolean Duration Void Null
Typy zmiennych: String (1) var s1 = 'Hello'; var s2 = "Hello"; Można osadzać apostrofy w cudzysłowie i odwrotnie var napis1 = 'ala"ma"kota'; var napis2 = "ala'ma'kota"; println(napis1); // ala ma kota println(napis2); // ala ma kota
Typy zmiennych: String (2) Wyrażenia osadzone def name = 'Joe'; var s = "Hello {name"; // s = 'Hello Joe' def answer = true; var s = "The answer is {if (answer) "Yes" else "No""; // s = 'The answer is Yes'
Typy zmiennych: String (3) Konkatenacja stringów def one = "This example "; def two = "joins two strings."; def three = "{one{two"; println(three); // 'This example joins two strings.'
Typy zmiennych: Number i Integer def numone = 1.0; // compiler will infer Number def numtwo = 1; // compiler will infer Integer Można jawnie zadeklarować typ zmiennej: def numone : Number = 1.0; def numtwo : Integer = 1; Pełna lista typów liczbowych: Byte, Short, Number, Integer, Long, Float, Double, Character
Typy zmiennych: Boolean var isasleep = true; Wyrażenie warunkowe: if (isasleep){ wakeup();
Typy zmiennych: Duration var a = 5ms; // 5 milliseconds var b = 10s; // 10 seconds var c = 30m; // 30 minutes var d = 1h; // 1 hour Przydatne przy tworzeniu animacji
Typy zmiennych: Void function printme() : Void { println("i don't return anything!"); Pisane z dużej litery!
Typy zmiennych: Null function checkarg(arg1: Address){ if(arg1 == null){ println("i received a null argument."); else{ println("the argument has a value.");
Funkcje: ogólna postać (1) Funkcja Void function nazwa_funkcji([argumenty]) { [ciało funkcji] lub function nazwa_funkcji([argumenty]) : Void { [ciało funkcji]
Funkcje: ogólna postać (2) Funkcja zwracająca wartość function nazwa_funkcji([argumenty]) { [ciało funkcji] return zwracana_wartość; lub function nazwa_funkcji([argumenty]) : zwracany_typ { [ciało funkcji] return zwracana_wartość;
Funkcje: przykład 1 def numone = 100; def numtwo = 2; var result; add(); //100 + 2 = 102 function add(){ result = numone + numtwo; println("{numone + {numtwo = {result");
Funkcje: przykład 2 function add(argone: Integer, argtwo: Integer) { var result = argone + argtwo; println("{argone + {argtwo = {result"); add(1,2); //1 + 2 = 3 function add(argone, argtwo) { var result = argone + argtwo; println("{argone + {argtwo = {result"); add(1,2); //1.0 + 2.0 = 3.0 Kolejność definiowania i wywoływania funkcji dowolna
Funkcje: wywołanie z linii komend //plik kalkulator.fx function run(args : String[]){ // Convert Strings to Integers def numone = java.lang.integer.parseint(args[0]); def numtwo = java.lang.integer.parseint(args[1]); // Invoke Functions add(numone,numtwo); function add(argone: Integer, argtwo: Integer){ var result = argone + argtwo; println("{argone + {argtwo = {result"); Wywołanie z linii komend javafxc kalkulator.fx javafx kalkulator 5 7
Sekwencje def weekdays = ["Mon","Tue","Wed","Thu","Fri"]; lub jawnie def weekdays: String[] = ["Mon","Tue","Wed","Thu","Fri"];
Sekwencje: spłaszczanie def days = [weekdays, ["Sat","Sun"]]; kompilator spłaszczy zagnieżdżoną sekwencję def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
Sekwencje: skrócona notacja def nums = [1..100];
Sekwencje: używanie predykatów def nums = [1,2,3,4,5]; def numsgreaterthantwo = nums[n n > 2]; // [3,4,5]
Sekwencje: dostęp do elementów def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; println(days[0]); println(days[1]); println(days[2]); println(days[3]); println(days[4]); println(days[5]); println(days[6]);
Sekwencje: operator sizeof def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; println(sizeof days); //7
Sekwencje: wstawianie elementów var days = ["Mon"]; insert "Tue" into days; //["Mon","Tue"]; insert "Fri" into days; insert "Sat" into days; insert "Sun" into days; //["Mon","Tue","Fri","Sat","Sun"]; insert "Thu" before days[2]; // ["Mon","Tue","Thu","Fri","Sat","Sun"]; insert "Wed" after days[1]; // ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
Sekwencje: usuwanie elementów delete "Sun" from days; // ["Mon","Tue","Wed","Thu","Fri","Sat"]; delete days[0]; //["Tue","Wed","Thu","Fri","Sat"]; delete days; //usuwa wszystkie elementy, ale nie samą sekwencję
Sekwencje: odwracanie var nums = [1..5]; reverse nums; //returns [5, 4, 3, 2, 1]
Sekwencje: porównywanie def seq1 = [1,2,3,4,5]; def seq2 = [1,2,3,4,5]; println(seq1 == seq2); //true def seq1 = [1,2,3,4,5]; def seq2 = [1,2,3,4,5,6]; println(seq1 == seq2); //false def seq1 = [1,2,3,4,5]; def seq2 = [1,3,2,4,5]; println(seq1 == seq2); //false
Sekwencje: cięcie def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; def weekend = days[5..6]; def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; def weekdays = days[0..<5]; def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; def weekend = days[5..]; def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; def days2 = days[0..<];
Operatory (1) przypisania = arytmetyczne proste: + - * / mod result = result mod 7; złożone: += -= *= /= unarne - ++ -- (zapis prefiksowy i postfiksowy) not var success = false; println(success); // false println(not success); // true równości i relacji ==!= > >= < <=
Operatory (2) warunkowe and or def username = "foo"; def password = "bar"; if ((username == "foo") and (password == "bar")) { println("test 1: username AND password are correct"); if ((username == "foo") or (password == "bar")) { println("test 3: username OR password is correct"); instanceof def str1="hello"; println(str1 instanceof String); //true def num = 1031; println(num instanceof Integer); //true
Wyrażenia wyrażenie blokowe wyrażenie warunkowe if operatory zakresu pętla for pętla while Wyrażenia try, catch, finally
Wyrażenia: blokowe var nums = [5, 7, 3, 9]; var total = { var sum = 0; for (a in nums) { sum += a ; sum; println("total is {total."); //Total is 24
Wyrażenia: warunkowe if def age = 8; var ticketprice; if (age < 5 ) { ticketprice = 0; else if (age < 12 or age > 65) { ticketprice = 5; else { ticketprice = 10; println("age: {age Ticket Price: {ticketprice dollars."); // Age: 8 Ticket Price: 5 dollars.
Wyrażenia: operatory zakresu var nums = [1..10 step 2]; println(nums); // [ 1, 3, 5, 7, 9 ] var nums = [10..1 step -1]; println(nums); // [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] var nums = [10..1 step 1]; println(nums); //warning
Wyrażenia: pętla for var days =["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]; for (day in days) { println(day);
Wyrażenia: pętla while var count = 0; while (count < 10) { println("count == {count"); count++;
Wyrażenia: try, catch, finally import java.lang.exception; try{ foo(); catch (e: Exception){ println("{e.getmessage() (but we caught it)"); finally{ println("we are now in the finally expression..."); println("the script is now executing as expected... "); function foo(){ var somethingweird = true; if(somethingweird){ throw new Exception("Something weird just happened!"); else{ println("we made it through the function."); //Something weird just happened! (but we caught it) //We are now in the finally expression... //The script is now executing as expected...
Klasy i obiekty Ogólny schemat klasy class nazwa_klasy{ [zmienne, stałe] [metody]
Klasy i obiekty: przykład (1) definicja klasy class Customer { var firstname: String; var lastname: String; var phonenum: Integer; function printname() { println("name: {firstname {lastname"); function printphonenum(){ println("phone: {phonenum");
Klasy i obiekty: przykład (2) inicjacja obiektu i wywołanie metod def customer = Customer { firstname: "John"; lastname: "Doe"; phonenum: "(408) 555-1212" customer.printname(); customer.printphonenum();
Klasy i obiekty: dziedziczenie (1) abstract class Account { var balance: Number; function withdraw(amount: Number): Void { balance -= amount; class SavingsAccount extends Account { var penalty = 5.00; function checkminbalance() : Void { balance -= penalty; class CheckingAccount extends Account { override function withdraw(amount: Number) : Void { balance -= amount;
Klasy i obiekty: dziedziczenie (2) dziedziczenie wielokrotne mixin class MyNameMixin { var firstname = "John"; var lastname = "Doe"; function printname(){ println("my name is: {firstname {lastname"); mixin class MyAddressMixin { var address = "1 Main Street, Anytown USA"; function printaddress(){ println("my address is: {address"); class MyContact extends MyNameMixin, MyAddressMixin { def mycontact = MyContact{; mycontact.printname(); mycontact.printaddress();
Tworzenie aplikacji graficznych (1) Puste okno import javafx.stage.stage; //required to render a window import javafx.scene.scene; //required to display a circle in a window Stage { title: JavaFX Is Easy!" scene: Scene { width: 300 height: 250 content: [ ]
Tworzenie aplikacji graficznych (2) Efekt
Tworzenie aplikacji graficznych (3) Okno z kołem w środku import javafx.stage.stage; import javafx.scene.scene; import javafx.scene.shape.circle; import javafx.scene.paint.color; Stage { title: "JavaFX Is Easy!" scene: Scene { width: 300 height: 250 content: [ Circle { ] centerx: 150, centery: 120, radius: 80, fill: Color.MAROON, stroke: Color.INDIANRED, strokewidth: 10.0
Tworzenie aplikacji graficznych (4) Efekt
Tworzenie aplikacji graficznych (5) Efekt
Tworzenie aplikacji graficznych (6) Efekt
Tworzenie aplikacji graficznych (7) Efekt
Tworzenie aplikacji graficznych (8) Efekt
Linki http://www.javafx.com http://www.javafx.com/samples http://www.javafx.com/docs/gettingstarted/eclipse-p