Luận văn Tìm hiểu kỹ thuật JAVAFX và ứng dụng

MỤC LỤC

 

CHƯƠNG 1: MỞ ĐẦU 13

1.1 Đặt vấn đề 13

1.2 Mục tiêu và yêu cầu của đồ án 15

1.3 Phương pháp nghiên cứu 15

1.3.1 Về nội dung: 15

1.3.2 Về cấu trúc: 15

CHƯƠNG 2: TỔNG QUAN 16

2.1 Tổng quan về tài liệu nghiên cứu 16

2.2 Các vấn đề và hướng nghiên cứu 17

CHƯƠNG 3: NỘI DUNG VÀ PHƯƠNG PHÁP NGHIÊN CỨU 18

3.1 Tìm hiểu hệ thống thông tin địa lý GIS 18

3.1.1 Định nghĩa GIS 18

3.1.2 Các thành phần của GIS: 20

3.1.2.1 . Phần cứng (Hardware) 20

3.1.2.2 . Dữ liệu 21

3.1.4.2 . Dữ liệu thuộc tính 27

3.1.4.2.1 Khái niệm 28

3.2 Tìm hiểu công nghệ RIA(Rich Interneet Application) 29

3.2.1 Khái niệm 29

3.2.2 Hiện trạng và lịch sử phát triển 31

3.3 . Khảo sát công nghệ Flex 32

3.3.1 Giới thiệu 32

3.3.2 Hiện trạng và lịch sử phát triển 32

3.4 Khảo sát công nghệ Silverlight 33

3.4.1 Giới thiệu 33

3.4.2 Hiện trạng và lịch sử phát triển 34

3.5 Tìm hiểu kỹ thuật JavaFX 34

3.5.1 JavaFX – “Write once, run anywhere” 34

3.5.2 JavaFX Platform 35

3.5.3 Kiến trúc JavaFX 36

3.5.3.1 Kiến trúc nền tảng 36

3.5.3.2 Kiến trúc hệ thống 36

3.5.4 Tính năng và lợi thế JavaFX 37

3.5.5 So sánh giữa Java và JavaFX 39

3.5.5.1 Biến, ràng buộc-Constants 40

3.5.5.2 Primitive Types 40

3.5.5.3 String Literals 40

3.5.5.4 Other Literals 40

3.5.5.5 Toán tử 40

3.5.5.6 Biểu thức 41

3.5.5.7 Function 41

3.5.5.8 Class 42

3.5.5.9 Khởi tạo đối tượng 42

3.5.5.10 Kế thừa 43

3.5.5.11 Phương thức “Overriding” 43

3.5.5.12 Getter, Setter 44

3.5.5.13 Sequence 44

3.5.6 JavaFX Tools 45

3.5.6.1 Designer Tool 45

3.5.6.2Developer Tool 50

3.5.7 JavaFX Script 51

3.5.7.1 Kiểu dữ liệu 51

3.5.7.1.1 Element specifier 51

3.5.7.1.2 Cardinality 52

3.5.7.1.2.1 Cardinality: option (0 or 1) 52

3.5.7.1.2.2 Cardinality: Required (1) 52

3.5.7.1.2.3 Cardinality: Sequence (0-n) 52

3.5.7.1.3 Giá trị mặc định 52

3.5.7.1.4 Value Type 53

3.5.7.1.4.1 String 53

3.5.7.1.4.3 Boolean 55

3.5.7.1.4.4 Duration 55

3.5.7.1.4.5 Function Types 55

3.5.7.1.4.6 Kiểu Void 55

3.5.7.1.4.7 Sequence type 56

3.5.7.2 Variable 57

3.5.7.2.1 Khai báo biến số 57

3.5.7.2.2 Các loại biến số 57

3.5.7.2.2.1 Script Variable 57

3.5.7.2.2.2 Instance Variables 57

3.5.7.2.2.3 Local Variables 58

3.5.7.2.2.4 Pseudo-variables 59

3.5.7.3Toán tử 59

3.5.7.3.1 Arithmetic Operators 60

3.5.7.3.2 Assignment Operators 60

3.5.7.3.3 Unary Operators 60

3.5.7.3.4 Relational Operators 61

3.5.7.3.5 Logical Operators 61

3.5.7.3.6 Instanceof Operators 61

3.5.7.4 Expressions 61

3.5.7.4.1 Block Expressions 61

3.5.7.4.2 If Expressions 62

3.5.7.4.3 For Expressions 62

3.5.7.4.4 While Expressions 63

3.5.7.4.5 Break and continue expressions 63

3.5.7.4.6 Binding Expression (undirectional bind (bind)) 63

3.5.7.4.6.1 Data binding là gì? 63

3.5.7.4.6.2 Ý nghĩa của từ khóa bind 64

3.5.7.4.6.3 Bindng to Conditional Expressions 64

3.5.7.4.6.4 Binding to for expressions 64

3.5.7.4.6.5 Bidirectional Bind (bind with inverse) 65

3.5.7.5 Sequences 67

3.5.7.5.1 Khai báo 67

3.5.7.5.2 Truy xuất những phần tử trong Sequence 67

3.5.7.5.3 Chèn phần tử vào trong Sequence 67

3.5.7.5.4 Xóa phần tử trong Sequence 68

3.5.7.5.5 Đảo ngược Sequence 68

3.5.7.5.6 So sánh nhiều Sequence 69

3.5.7.5.7 Sequence Slices 69

3.5.7.5.8 Sử dụng Predicates 69

3.5.7.5.9 Binding Sequences: giống bind với biểu thức for 69

3.5.7.6 Function 70

3.5.7.6.1 Định nghĩa 70

3.5.7.6.2 Phân loại 70

3.5.7.6.2.1 Script Functions 70

3.5.7.6.2.2 Instance Function 71

3.5.7.6.3 Binding to a Function 71

3.5.7.6.3.1 Binding to a non - bound function 71

3.5.7.6.3.2 Binding to a bound function 72

3.5.7.7 Classes and Objects 73

3.5.7.7.1 Class 73

3.5.7.7.1.1 Khai báo class 73

3.5.7.7.1.2 Lớp và sự kế thừa 74

3.5.7.7.1.2.1 Lớp trừu tượng 74

3.5.7.7.1.2.2 Mixin Classes 74

3.5.7.7.1.3 Class modifiers 76

3.5.7.7.2 Object literals 76

3.5.7.8 Trigger 77

3.5.7.9 Package and access modifiers 79

3.5.7.9.1 Package 79

3.5.7.9.2 Access modifiers 79

3.5.7.9.2.1 Primary access modifier 79

3.5.7.9.2.2 Var access modifier 79

3.5.7.10 Exception Handling 79

3.5.8 Yêu cầu hệ thống cho ứng dụng JavaFX version 1.2 80

3.5.9 Giới thiệu các gói thư viện trong JavaFX 1.2 81

3.5.9.1 javafx.animation 81

3.5.9.2 Javafx.animation.transition 85

3.5.9.3 Javafx.async 85

3.5.9.4 Javafx.data, javafx.data.feed, javafx.data.feed.atom 86

3.5.9.5 Javafx.data.feed.rss 86

3.5.9.6 Javafx.ext.swing 86

3.5.9.7 Javafx.fxd 86

3.5.9.8 Javafx.geometry 86

3.5.9.9 Javafx.lang 86

3.5.9.10 Javafx.reflect 86

3.5.9.11 Javafx.scene 86

3.5.9.12 Javafx.scene.control 86

3.5.9.13 Javafx.scene.effect 86

3.5.9.14 Javafx.scene.effect.light 86

3.5.9.15 Javafx.scene.image 86

3.5.9.16 Javafx.scene.input 87

3.5.9.17 Javafx.scene.layout 87

3.5.9.18 Javafx.scene.media 87

3.5.9.19 Javafx.scene.paint 87

3.5.9.20 Javafx.scene.shape. 87

3.5.9.21 Javafx.scene.text 87

3.5.9.22 Javafx.scene.transform 87

3.5.9.23 Javafx.stage 87

3.5.10 Hướng dẫn xây dựng ứng dụng GUI đơn giản : 87

3.5.10.1 Tạo các đối tượng hoạt họa 87

3.5.10.1.1 Common Profile 87

3.5.10.1.1.1 Tạo Scene Ứng Dụng 88

3.5.10.1.1.2 Thêm Hình Nền Vào 88

3.5.10.1.1.3 Vẽ mây 90

3.5.10.1.1.4 Tạo Chuyển Động Ngang 94

3.5.10.1.1.5 Thêm Chuyển Động Thẳng Đứng Vào 96

3.5.10.1.1.6 Điều Khiển Chu Kỳ Timeline 100

3.5.10.1.2 Desktop Profile 104

3.5.10.2 Sự Tương Tác Giữa Các Phần Tử GUI 104

3.5.10.2.1 Common Profile 105

3.5.10.2.1.1 Thêm Các Graphic Vào 105

3.5.10.2.1.2 Bắt Sự Kiện Click 105

3.5.10.2.1.3 Bắt Sự Kiện Release 107

3.5.10.2.1.4 Bắt Sự Kiện Press 107

3.5.10.2.1.5 User Interface Elements 107

3.5.10.2.1.6 Charts 108

3.5.10.2.2 Desktop Profile 109

3.5.10.2.2.1 Thêm Các Graphic Vào 110

3.5.10.2.2.2 Định Nghĩa Con Trỏ 110

3.5.10.2.2.3 Bắt Sự Kiện Chuột Vào 111

3.5.10.2.2.4 Bắt Sự Kiện Click Chuột 112

3.5.10.2.2.5 Sự Kiện Nhấn Chuột 115

3.5.10.2.2.6 Bắt Sự Kiện Thả Chuột 115

3.5.10.2.2.7 Bắt Sự Kiện Nhấn Chuột Thoát Ra 116

3.5.10.3 Áp Dụng Data Binding Cho Các Đối Tượng UI 117

3.5.10.3.1 Common profile 117

3.5.10.3.2 Desktop profile 120

3.5.11 Triển khai ứng dụng trên brower 121

3.6 So sánh JavaFX, Sliverlight và Flex 127

3.7 Tìm hiểu kỹ thuật SVG 127

3.7.1 Giới thiệu về chuẩn vecto cho bản đồ 127

3.7.2 Định nghĩa SVG 127

3.7.3 Vai trò của đồ họa vecto trong ứng dụng bản đồ 128

3.7.4 Ưu và nhược điểm của SVG 129

3.7.4.1 Ưu điểm 129

3.7.4.2 Nhược điểm 130

3.8 Một số vấn đề gặp phải và hướng giải quyết 131

3.8.1 Bản đồ số hóa và dữ liệu 131

3.8.1.1 Vấn đề 131

3.8.1.2 Hướng giải quyết 131

3.8.2 Chuyển dữ liệu từ MapInfo: 131

3.8.2.1 Vấn đề: 131

3.8.2.2 Hướng giải quyết: 131

3.8.3 Không preview được file .FXZ 139

3.8.3.1 Vấn đề 139

3.8.3.2 Hướng giải quyết 139

3.8.4 Thao tát trên thành phần .fxz: 142

3.8.4.1 Vấn đề: 142

3.8.4.2 Hướng giải quyết: 142

CHƯƠNG 4: HỆ THỐNG QUẢN LÝ THÔNG TIN BẢN ĐỒ THÀNH PHỐ HỒ CHÍ MINH 144

4.1 Phát biểu bài toán 144

4.2 Các yêu cầu chức năng chính cùa hệ thống 144

4.3 Mô hình usecase 144

4.4 Đặc tả usecase 145

4.4.1 Usecase Tìm kiếm quận/huyện 145

4.4.2.2 Tóm tắt 145

4.4.2.3 Actor 145

4.4.2.4 Điều kiện tiên quyết 145

4.4.2.5 Post-Condition 145

4.4.2.6 Dòng sự kiện chính 145

4.4.2.7 Dòng sự kiện phụ 145

4.4.2 Usecase Tìm kiếm phường/xã 146

4.4.2.1 Tóm tắt 146

4.4.2.2 Actor 146

4.4.2.3 Điều kiện tiên quyết 146

4.4.2.4 Post-Condition 146

4.4.2.5 Dòng sự kiện chính 146

4.4.2.6 Dòng sự kiện phụ 146

4.4.3 Usecase Tìm kiếm đường 146

4.4.3.1 Tóm tắt 146

4.4.3.2 Actor 146

4.4.3.3 Điều kiện tiên quyết 147

4.4.3.4 Post-Condition 147

4.4.3.5 Dòng sự kiện chính 147

4.4.3.6 Dòng sự kiện phụ 147

4.5 Class Diagram 147

4.6 Mô hình quan hệ trong cơ sở dữ liệu 148

CHƯƠNG 5: KẾT QUẢ ĐẠT ĐƯỢC VÀ HƯỚNG PHÁT TRIỂN 149

5.1 Kết quả đạt được 149

5.2 Hướng phát triển 149

DANH MỤC TÀI LIỆU THAM KHẢO 150

PHỤ LỤC 151

 

 

doc191 trang | Chia sẻ: netpro | Lượt xem: 4303 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Luận văn Tìm hiểu kỹ thuật JAVAFX và ứng dụng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
… content: [ SwingButton { text: bind helloString action: function() { helloString = "Data binding"; …} Kết quả khi chạy chương trình Kết quả khi nhấn nút Hello JavaFX Ý nghĩa của từ khóa bind Bind làm cho giá trị của một biến thay đổi theo giá trị của một biểu thức mà nó bind tới. Khi viết một biểu thức được bind như sau: bind someExpression; nghĩa là khi someExpression thay đổi, x sẽ được cập nhật lại. var k =5; function sum(x: Integer, y: Integer): Integer{ return x+y; } def result = bind sum(4, 5) * k; println(result);//45 k = 7; println(result);//63 Hàm sum() được gọi để tính giá trị của result,nhưng khi k = 7, thì hàm sum() không được gọi lại lần nữa (vì nó không thay đổi), giá trị của nó được nhớ và sử dụng lại Bindng to Conditional Expressions Nếu gía trị condExpr thay đổi, câu lệnh if sẽ đảo ngược lại. Do đó sẽ gây ra việc tính toán lại mỗi lần giá trị của condExpr thay đổi var dk = true; def num = bind if(dk) 1 else 2; println(num);//num = 1 dk = false; println(num);//num = 2 Binding to for expressions Chú ý: khai báo biến newSeq bằng def , điều này ngăn không cho gán giá trị vào biến newSeq . Nếu seq thay đổi, những phần tử trong newSeq cũng tương ứng với những phần tự trong seq. var seq1 = [1..10]; def seq2 = bind for(item in seq1) item *2; //seq1=[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] //seq2 = [ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 ] Nghĩa là, nếu một phần tử được chèn vào seq, kết quả của việc áp dụng expr cho phần tử đó được chèn vào newSeq ở vị trí tương ứng và những phần tử khác không được tính lại. var seq1 = [1..10]; def seq2 = bind for(item in seq1) item *2; insert 11 into seq1; //seq1=[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ] //seq2= [ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22 ] Có một ngoại lệ cho quy luật đó, nếu expr dùng indexof element thì index của những phần tử này thay đổi sẽ cần được cập nhật. function square(x : Integer) : Integer { x*x } def values = bind for (x in [min..max]) square(x); (1) println(values);//[0, 1, 4, 9 ] max = 5; (2) println(values);// [ 0, 1, 4, 9, 16, 25 ] min = 1; (3) println(values); // [ 1, 4, 9, 16, 25 ] min = 0; (4) println(values); // [ 0, 1, 4, 9, 16, 25 ] (1) : bình phương của các số từ 0 tới 3 được tính. (2): bình phương của 4 và 5 được tính (không tính lại từ 0 tới 3) (3) : bình phương của 0 bị xóa (4) : tính lại bình phương của 0. Đối với các biểu thức while, insert, delete thì không thể xảy ra trong khối lệnh bind vì chúng có kiểu là Void, và không có giá trị trả về Bidirectional Bind (bind …with inverse) Nếu x thay đổi thì z sẽ được cập nhật theo giá trị của x. Với từ khóa with inverse, nếu giá trị của z thay đổi thì x cũng sẽ thay đổi theo z. var k = 5; var z = bind k with inverse; println("z: {z}, k: {k}");//z = 5, k = 5 z = 6; println("z: {z}, k: {k}");//z = 6, k = 6 Bởi vì, nó được có thể gán giá trị, biểu thức được bind (bound expression) có những hạn chế. Hạn chế này làm cho gắn kết hai chiều không hay đối với biến cục bộ. Nó thì đáng quan tâm trong việc bind những biến thể hiện của những đối tượng. Và rất hữu dụng trong tương tác người dùng. class Point { var x : Number; var y : Number; override function toString() : String { "Point({x},{y})" }} def pt = Point { x: 3.0 y: 5.0 } def projectionOnX = Point { x: bind pt.x with inverse y: 0.0 } println( pt );// Point(3.0, 5.0) println( projectionOnX );//Point(3.0, 0.0) pt.x = 7.6; println( pt );//Point(7.6, 5.0) println( projectionOnX );//Point(7.6, 0.0) Và rất hữu dụng trong tương tác người dùng. var factor= 1; Stage{ width:200 height:150 scene:Scene{ content: [ Text{ x:14 , y :65 content: bind "{factor}" }, SwingSlider { translateX: 70 translateY: 10 blocksMouse:true rotate:90 minimum: 1 maximum: 15 height:80 value: bind factor with inverse vertical: true }]} } Sequences Sequences miêu tả một dãy đối tượng Khai báo Sequence được đặt trong cặp ngoặc vuông var i = []; var x:Integer[]; var weekdays = ["Mon", "Tue", "Web", "Thurs", "Fri"]; var weekDays:String[] = ["Mon", "Tue", "Web", "Thurs", "Fri"]; Sequence này có thể được khai báo trong một Sequence khác. Ví dụ sau cả 2 Sequence đều tương đương nhau var weekdays = ["Mon", "Tue", "Web", "Thurs", "Fri"]; var days = [weekDays, "Sat", "Sun"]; vardays = ["Mon", "Tue", "Web", "Thurs", "Fri", "Sat", "Sun"]; Có thể tạo một Sequence như sau: Tạo một dãy số nguyên chẵn từ 2 đến 10: var evenPosInteger = [2..10 step 2] Để khai báo một dãy số theo thứ tự giảm dần, thì số thứ nhất phải lớn hơn số thứ hai. Tuy nhiên, đối với số âm, phải dùng hàm step, vì mặc định bước nhảy là 1. var negativeNumbers = [0..-10]; // Empty sequence var negativeNumbers = [0..-10 step -1]; // 0,-1,-2,...-10 var negativeNumbers = [0..<-10 step -1]; // 0,-1,-2,...,-9 Truy xuất những phần tử trong Sequence Các phần tử trong một dãy luôn được đánh số bắt đầu từ số 0. Phần tử đầu tiên là phần tử thứ 0. Và phần tử cuối cùng của một dãy n phần tử sẽ có số thứ tự là n-1.Ta có thể tham khảo giá trị của một phần tử trong dãy bằng cách gán số thứ tự của phần tử ta muốn truy xuất vào giữa 2 cặp ngoặc vuông. Xác định số phần tử trong dãy sử dụng toán tử sizeof var weekDays:String[] = ["Mon", "Tue", "Web", "Thurs", "Fri"]; println(weekDays[3]);//Thurs println(sizeof weekDays);//5 Chèn phần tử vào trong Sequence Từ khóa insert cho phép chèn phần tử vào trong dãy, chèn trước (before), hoặc chèn sau (after) một phân tử đã chỉ định. insert…into: chèn phần tử vào ở vị trí cuối dãy. var days = ["Mon"]; insert "Thurs" into days;//["Mon", "Thurs"] insert…before: chèn trước một phần tử nào đó đã chỉ định var days = ["Mon", "Tue", "Thurs"]; insert "Wed" before days[2];//["Mon", "Tue", "Wed", "Thurs"] insert…after: chèn sau một phần tử đã chỉ định var days = ["Mon", "Tue", "Thurs"]; insert "Wed" after days[1];//["Mon", "Tue", "Wed", "Thurs"] Chèn trước và sau một index âm thì nó sẽ chèn ở vị trí đầu tiên của Sequence. Chèn trước hay sau một index vượt ra ngoài dãy thì nó sẽ chèn vào ở vị trí cuối của Sequence. Biểu thức insert không có giá trị, có kiểu là Void. Xóa phần tử trong Sequence Xóa một phần tử hoặc những phần tử ra khỏi Sequence. delete sequence[index]: Xóa phần tử của Sequence ở vị trí index. Nếu không có phần tử ở vị trí index, nó sẽ lờ đi. delete sequence[begin..end]: Xóa những phần tử bao gồm từ vị trí đầu đến vị trí cuối. Nếu không có phần tử thuộc trong những chỉ mục này, những chỉ mục đó sẽ bi lờ đi. delete value from sequence: xóa tất cả những phần tử nào có giá trị giống với giá trị muốn xóa delete sequence: Xóa tất cả các phần tử của Sequence. var days = ["Mon", "Mon", "Tue", "Wed", "Mon", "Thurs", "Fri", "Sat", "Sun"]; delete days[3];//[Mon, Mon, Tue, Mon, Thurs, Fri,Sat, Sun] delete days[5..6];//[ Mon, Mon, Tue, Mon, Thurs, Sun ] delete "Mon" from days;// [Tue, Thurs, Sun] delete days; //[] Đảo ngược Sequence Để đảo ngược Sequence sử dụng từ khóa reverse. var nums = [1..5]; var rs = reverse nums; print(rs);//[ 5, 4, 3, 2, 1 ] So sánh nhiều Sequence Những dãy được gọi là bằng nhau nếu: Chiều dài của chúng bằng nhau Những phần tử của chúng bằng nhau. var seq1 = [1, 2, 3, 4, 5]; var seq2 = [1, 2, 3, 4, 5]; var seq3 = [1, 2, 3, 4, 5, 6]; var seq4 = [1, 2, 4, 3, 5]; println(seq1 = = seq2);//true println(seq1 = = seq3); //false println(seq1 = = seq4); //false Sequence Slices seq[a..b] : truy xuất những phần tử bao từ a tới b (bao gồm cả a và b). seq[a..<b] : truy xuất những phần tử giữa a và b (kể cả a) seq[a..] : truy xuất tất cả những phần tử từ a tới cuối dãy (kể cả a) seq[a..<] : truy xuất mọi thứ bắt đầu từ a đến cuối dãy, ngoại trừ phần tử cuối. var weekdays = ["Mon", "Tue", "Wed", "Thurs", "Fri"]; var day1 = weekdays[2..4];//[ Wed, Thurs, Fri ] var day2 = weekdays[2..<4];//[ Wed, Thurs ] var day3 = weekdays[2..];//[ Wed, Thurs, Fri ] var day4 = weekdays[1..<];//[ Tue, Wed, Thurs ] Sử dụng Predicates Sử dụng biểu thức boolean (cũng được gọi là predicate), để khai báo một chuỗi mới là tập hợp con của chuỗi đã cho. def nums =[1, 2, 3, 4, 5]; def numGreaterThanTwo = nums[n|n>2]; //[ 3, 4, 5 ] Chọn tất cả các phần tử trong dãy nums những số lớn hơn 2. Trong ví dụ trên: Tạo một dãy mới numGreaterThanTwo Chỉ định một dãy gốc nums[n|n>2] để sao chép những phần tử vào trong dãy mới. Tìm giá trị n sao cho n lớn hơn 2, và sau đó sao chép những phần tử đó vào trong dãy mới. Binding Sequences: giống bind với biểu thức for Function Định nghĩa Hàm là một khối lệnh thực thi để thi hành chức năng riêng biệt Cú pháp: Trong đó: Cách truy xuất: (modifier) abstract : khai báo hàm thể hiện không có mã lệnh. Lớp định nghĩa cũng phải là lớp abstract. Lớp cụ thể (không phải abstract) cần phải override hàm đã định nghĩa trong lớp mà nó kể thừa. override: hàm thể hiện (instance function) có thể ghi đè định nghĩa hàm trong lớp cha của nó nếu bổ ngữ override được dùng package: Hàm chỉ có thể được truy xuất bên trong gói. protected: hàm chỉ có thể được gọi từ gói mà nó định nghĩa và từ những lớp con của nó public: có thể được truy xuất từ bất kỳ lớp bên ngoài nào. formalParameters là những đối số mà hàm có thể nhận vào. Và những đối số đó có tên và kiểu của nó Phân loại Script Functions Được khai báo ở vị trí trên của tập lệnh (script), không bên trong định nghĩa lớp function square(num:Integer):Integer{ num * num; } println(square(7)); Instance Function Được khai báo bên trong định nghĩa lớp class Scale { var factor: Number; function transform(x:Number):Number{ factor * x; } } var tf = Scale{ factor: 25.0 } println(tf.transform(10.0)); Binding to a Function Binding to a non - bound function Non bound funtion là 1 function không bắt đầu bằng từ khóa bound. Funtion được gọi lại nếu bất kỳ đối số nào thay đổi. Những đối số nào ở phạm vi của function, khi mà giá trị của nó thay đổi thì không gây ra việc sự tính toán lại. class Point{ var x : Number; var y : Number; } var scale = 1.0; function makePoint(x0: Number, y0: Number):Point{ Point{ x : x0*scale y : y0*scale } } var myX = 3.0; var myY = 3.0; def pt = bind makePoint(myX, myY); println("x: {pt.x}, y: {pt.y}");//x: 3.0, y: 3.0 myX = 10.0; println("x: {pt.x}, y: {pt.y}");//x: 10.0, y: 3.0 scale = 2.0; println("x: {pt.x}, y: {pt.y}");//x: 10.0, y: 3.0 Binding to a bound function Bound function bắt đầu bằng từ khóa bound. Những giá trị của đối số nằm trong hoặc nằm ngoài phạm vi của hàm thay đổi đều gọi lại hàm và tính toán lại class Point{ var x : Number; var y : Number; } var scale = 1.0; bound function makePoint(x0: Number, y0: Number):Point{ Point{ x : x0*scale y : y0*scale } } var myX = 3.0; var myY = 3.0; def pt = bind makePoint(myX, myY); println("x: {pt.x}, y: {pt.y}");//x: 3.0, y: 3.0 myX = 10.0; println("x: {pt.x}, y: {pt.y}");//x: 10.0, y: 3.0 scale = 2.0; println("x: {pt.x}, y: {pt.y}");//x: 20.0, y: 6.0 Classes and Objects Class Khai báo class Để khai báo lớp trong JavaFX, sử dụng từ khóa class public class MyClass{ } Từ khóa public được gọi là access modifier và ý nghĩa là lớp này có thể được dùng trong những lớp hoặc những đoạn script khác. Dù lớp đó được khai báo bên trong file script khác. Nếu lớp không có modifier, nó chỉ có thể truy xuất bên trong đoạn script nơi nó được khai báo. class Point {// private class only //visible to the ArtWork class var x:Number; var y:Number; } public class ArtWork { var location: Point; } Lớp Point không có modifier, vì thế nó chỉ có thể thấy trong đoạn script và chỉ có thể được dùng trong script ArtWork. Đối với mỗi file script JavaFX, có một lớp được khởi tạo bằng tên file script, dù là lớp đó không được định nghĩa một cách chính xác. var myObject : MyClass; Ví dụ đối với lớp ArtWork.fx, có một lớp ArtWork. Và nếu chúng ta không khai báo public class ArtWork bên trong script vẫn đúng. Lớp và sự kế thừa Để extend một lớp, sử dụng từ khóa extends .Những lớp JavaFX có thể extend tối đa một lớp Java hoặc JavaFX. Nếu extend lớp Java, lớp đó có constructor mặc định. public class Porsche911 extends Porsche { } JavaFX có thể extend nhiều mixin lớp JavaFX hoặc nhiều interface Java Lớp trừu tượng Lớp trừu tượng được khai báo là abstract, nghĩa là lớp này không được thể hiện một cách trực tiếp, chỉ được thể hiện ở những lớp con của nó. public abstract class MyAbstractClass { } Những phương thức của lớp trừu tượng cũng được khai báo là abstract. public abstract class AnotherAbstractClass { public abstract function setXY(x:Number, y:Number) : Mixin Classes JavaFX hỗ trợ một hình thức kế thừa gọi là mixin inheritance. Để hỗ trợ điều này, JavaFX bao gồm một lớp mixin. Lớp mixin là lớp cung cấp những hàm được kế thừa bởi những lớp con. Chúng không được khởi tạo bên trong chính lớp mixin. Lớp mixin khác Java interface ở chỗ là mixin có thể cung cấp sự thi hành mặc định cho những hàm của nó và cung có thể khai báo và khởi tạo biến. Khai báo lớp mixin: Dùng từ khóa mixin trước khai báo lớp public mixin class ProductMixin { Lớp mixin có thể chứa một số khai báo hàm. Nếu khai báo hàm có phần thân, thì đây là sự thực thi mặc định cho hàm đó. public mixin class Positioner { protected bound function centerX( node: Node, within: Node) : Number { (within.layoutBounds.width - node.layoutBounds.width)/2.0 - node.layoutBounds.minX; } protected bound function centerY(node: Node, within: Node) : Number { (within.layoutBounds.height - node.layoutBounds.height)/2.0 - node.layoutBounds.minY; } } Những lớp con muốn thực thi lại những hàm của lớp mixin phải dùng từ khóa override khi khai báo hàm. public class My Positioner extends Positioner { public override bound function centerX(node: Node, within: Node) : Number { (within.boundsInParent.width - node.boundsInParent.width )/2.0; } } Nếu hàm của lớp mixin không có thực thi mặc định, hàm đó phải được khai bào là abstract và những lớp con override những hàm này. public abstract function bottomY(node: Node, within: Node, padding: Number) : Number; public class My Positioner extends Positioner { public override function bottomY(node: Node, within: Node, padding: Number) : Number { within.layoutBounds.height - padding - node.layoutBounds.height; } } Nếu hai mixin có cùng tên hàm (function signature) hoặc tên biến, hệ thống giải quyết hàm hoặc biến dựa và mixin nào được khai báo đầu tiên trong mệnh đê extends. Để chỉ rõ hàm hoặc biến của mixin nào , thì dùng tên lớp mixin với tên hàm hoặc tên biến của nó. public class My Positioner extends Positioner, AnotherPositioner { var offset = 10.0; public override bound function centerX(node: Node, within: Node) : Number { Positioner.centerX(node, within) + offset; } } Mixins cũng có thể định nghĩa biến số. Những lớp con kế thừa hoặc override những biến số này, public mixin class Positioner { public var offset: Number = 10.0; } public class My Positioner extends Positioner { public override var offset = 5.0 on replace { println("{offset}"); } } Nếu một lớp extends một lớp JavaFX và môt hay nhiều mixin, lớp JavaFX ưu tiên hơn những lớp mixin trong việc khởi tạo biến. Đối với những lớp mixin, thứ tự ưu tiên dựa vào thứ tự chúng được định nghĩa trong mệnh đề extends Class modifiers public : lớp có thể được truy cập từ các lớp , script hoặc gói khác. package: lớp có thể được truy xuất trong phạm vi gói abstract: lớp này không được thể hiện một cách trực tiếp , chỉ được thể hiện bên trong lớp con của nó. Và những lớp con này phải override phương thức của lớp này Object literals Trong JavaFX, những đối tượng (object) được thể hiện sử dụng object literals. var title = Title { text: "JavaFX is cool" x: 10 y: 50 onMouseClicked: function(e:MouseEvent):Void { // do something } }; Khi khai báo một object literal, những biến thể hiện có thể được ngăn cách bằng dấu phẩy hoặc khoảng trắng, dấu chấm phẩy. Có thể override những hàm trừu tượng (abstract) bên trong khai báo object literal. import java.awt.event.ActionListener; import java.awt.event.ActionEvent; var listener = ActionListener { override function actionPerformed(e: ActionEvent) : Void { println("Action Performed!"); Trigger JavaFX có một tính năng cho phép thực thi mã khi những biến trong chương trình thay đổi giá trị. Điều này được gọi là trigger và được thực hiện với từ khóa on replace. Trigger giống như biểu thức ràng buộc (bindind expression) ngoại trừ không hạn chế đối với khai báo def hoặc var.Trong JavaFX, có các trigger sau: trigger với các biến, trigger với thuộc tính, trigger với sequences và trigger với bind. On replace với biến: On repalce với sequeces: Cú pháp: Var seq = [sequence] on replace oldValue [low..high] = newSeq{ … } Khi dãy seq thay đổi, oldValue là dãy trước đó, low và high là chỉ số của dãy đã thay đổi, và newSeq là một dãy mới. oldValue[low..high] là một sequence slice. Ví dụ: var chars = ['a', 'b', 'c'] on replace old[lb..ub] = newchars{ println("old = {old} low={lb} high={ub} newchars = {newchars}"); }//old = low=0 high=-1 newchars = abc insert 'd' into chars;//old = abc low=3 high=2 newchars = d delete 'a' from chars;//old = abcd low=0 high=0 newchars = chars[1..2] = ['i', 't']; println(chars);//[ b, i, t ] On replace với isInitialized Hàm isInitialized trả về true nếu đối số của nó đã được thiết lập trước đó. Điều này thì quan trọng đối với khối lệnh on replace, vì nó thực hiện ít nhất một lần. Nếu biến trong chương trình nhận một giá trị mặc định, và không muốn thực thi những khai báo này trong khối lệnh on replace. Hàm isInitialized có thể ngăn chặn điều này. Ví dụ: class Distance{ def factor = 100; var miles: Number on replace{ if(isInitialized(miles)) kilometers = miles * factor; } var kilometers: Number on replace{ if(isInitialized(kilometers)){ miles = kilometers/factor; } } function print(){ println("Miles = {miles}, Kilometers = {kilometers}") } } Distance{miles:600}.print();//Miles = 600.0, Kilometers = 60000.0 Distance{kilometers: 500}.print();//Miles = 5.0, Kilometers = 500.0 Distance{}.print();//Miles = 0.0, Kilometers = 0.0 On replace với bind Cú pháp: Def v = bind w on replace oldValue{ … } Nêu w thay đổi, v được cập nhật theo giá trị của w và khi đó đoạn mã trong khối lệnh của on replace thực thi. Trước đó, oldValue là tùy chọn Package and access modifiers Package Gói cho phép thiết lập tạo và kết cấu những lớp và mối quan hệ với gói khác. package javafxlanguage; public class Person { public var firstName: String; public var lastName: String; } Access modifiers Những access modifier áp dụng vào tập lệnh (script) và những thành phần thể hiện (instance members): instance functions, script functions, instance variables, và script variables. Ngoại trừ protected, còn được áp dụng cho những lớp Primary access modifier Script only access—nó chỉ có thể truy cập bên trong đoạn script mà nó định nghĩa package Package access: Chỉ có thể truy cập trong phạm vi gói protected Protected access:Có thể được truy cập từ gói mà nó định nghĩa và từ những lớp dẫn xuất của lớp đó public Public access: Có thể truy cập bất kỳ ở đâu. Hình 3.34 Primary access modifier Var access modifier public-read Biến có thể đọc bất kỳ ở đâu (var) public-init Biến có thể được khởi tạo và đọc bất kỳ ở đâu. Nơi khởi tạo được đặt trong objectLiteral (nhưng không bound) Hình 3.35 Var access modifier Chú ý rằng public-read được dùng với def, nhưng nó thì tương đương với public Exception Handling Khai báo throw giống với Java và chỉ có thể ném một lớp extends java.lang.Throwable. Biểu thức try/catch/finally giống như Java, nhưng sử dụng cú pháp của JavaFX try { } catch (e:SomeException) { } finally { } Yêu cầu hệ thống cho ứng dụng JavaFX version 1.2 Công nghệ JavaFX 1.2 Tác dụng JDK 6 Update 13 (đề nghị JDK 6 Update 14) Cài đặt Java SE Development Kit Cài đặt bao gồm Java Runtime Environtment (JRE) Thành phần bắt buộc trước khi cài IDE JavaFX 1.2 SDK Software Development Kit của JavaFX 1.2 NetBeans IDE 6.7.1 for JavaFX 1.2 Developer tool cho phép developer phát triển ứng dụng Cài đặt NetBeans IDE for JavaFX đã bao gồm phiên bản JavaFX SDK tương ứng (JavaFX 1.2 SDK) JavaFX 1.2 Production Suite Designer tool cho phép designer thiết kế giao diện ứng dụng JavaFX Plugin for Adobe Photoshop và JavaFX Plugin for Adobe Illustrator : cho phép xuất ra graphic dưới định dạng JavaFX JavaFX Media Factory: SVG Converter: Chuyển từ SVG sang định dạng JavaFX JavaFX Graphics Viewer: xem hình ảnh file đã chuyển sang định dạng JavaFX, cho phép xem trước hình ảnh khi xuất hiện trên các ứng dụng desktop hay mobile Các yêu cầu phần mềm và hệ thống sau đây cần phải có trước khi sử dụng công nghệ JavaFX 1.2 Công nghệ JavaFX 1.2 chạy trên Windows và Mac OS X. Ngoài ra có phiên bản beta của JavaFX 1.2 SDK dùng cho hệ điều hành Ubuntu Linux và OpenSolaris. Các yêu cầu phần mềm và hệ thống khi muốn cài đặt các thành phần của JavaFX 1.2 (NetBeans IDE 6.7.1 for JavaFX 1.2 (đã bao gồm JavaFX 1.2 SDK) và JavaFX 1.2 Production Suite). Lưu ý: khi cài đặt JDK đã bao gồm cả Java Runtime Environment (JRE) Hình 3.36 System requirement cho JavaFX ver 1.2 Giới thiệu các gói thư viện trong JavaFX 1.2 javafx.animation Animation là trái tim và lịnh hồn của JavaFX. Một cách đơn giản nó làm cho những đối tượng trở nên sống động JavaFX cung cấp một palette phong phú cho animation. Với Timelines có thể xây dựng bất kỳ những hoạt ảnh nào mà mình muốn. Timeline cho phép chỉ định interpolator, tỷ lệ, số lần lặp lại, những giá trị mới và những hành động, Timeline cung cấp một dãy thuộc tính cho phép dùng để thay đổi những đặc tính của một đối tượng trong một khoảng thời gian quy định …. Nếu muốn làm đối tượng mờ dần, xoay hoặc co dãn đối tượng một cách đơn giản. Sử dụng gói javafx.animation.translation trong javafx. Timelines Những biến thuộc tính của JavaFX Node khi thay đổi, tự động cập nhật scene graph. Do đó, nếu thay đổi giá trị thuộc tính, scene tự động biến đổi node. Những thuộc tính phổ biến của node dùng để hoạt ảnh là translateX và translateY để di chuyển theo hướng x và y, scaleX và scaleY để co dãn node theo hướng x và y, và rotate để xoay node theo định hướng mới. Và những cái đó có thể sử dụng đơn giản bằng cách thao tác với những giá trị thuộc tính của timeline. Một Timeline là một dãy KeyFrame . Mỗi KeyFrame chỉ định một khoảng thời gian (thuộc tính time) bên trong timeline. KeyFrames chứa một dãy KeyValue (values) hoặc một hàm ( action) hoặc cả hai. Timeline có những thuộc tính và những hàm để làm cho những kịch bản hoạt ảnh khác nhau ăn khớp với nhau. Ví dụ thuộc tính rate kiểm soát thời gian. Khi rate là 1 (giá trị mặc định), timeline chạy với tốc độ bình thường suốt một dãy KeyFrames. Nếu rate là -1, nó chạy ở vị trí ngược lại với tốc độ bình thường . Rate là 2, timeline chạy 2 lần với tốc độ nhanh. Hàm play bắt đầu hoạt ảnh ở vị trí hiện tại của nó. Hàm pause dừng hoạt ảnh và khi hoạt động lại nó sẽ bắt đầu ngay vị trí mà nó dừng. Hàm stop ngừng timelime và bắt đầu ở vị trí cũ. Hàm playFromStart bắt đầu một timeline vào thời điểm lúc bắt đầu của một chu kỳ timeline. Interpolation được dùng để tính giá trị trung gian giữa 2 điểm. Trong hoạt ảnh của JavaFX, interpolation cung cấp những giá trị trung gian giữa giá trị của một KeyFrame với một KeyFrame kế tiếp. Giá trị trung gian thật sự phụ thuộc vào interpolator nào được dùng. Mặc định của interpolation là linear, cung cấp một tập hợp giá trị trung gian với hằng số rate tăng hoặc giảm Muốn hoạt ảnh những thuộc tính của đối tượng giống nhau, nhưng muốn những thuộc tính thay đổi một cách độc lập chẳng hạn như thuộc tính repeatCount, . Trong trường hợp này, sử dụng những timeline riêng biệt. Di chuyển theo hướng x: Timeline{ autoReverse:true repeatCount:Timeline.INDEFINITE keyFrames: [ at(0s){circle.translateX => 0.0} at(3s){circle.translateX => 165.0 tween Interpolator.EASEBOTH} ] }.play(); Di chuyển theo hướng y Timeline{ autoReverse:true repeatCount:Timeline.INDEFINITE keyFrames: [ at(0s) {circle.translateY =>0.0} at(2s) {circle.translateY =>130 tween Interpolator.EASEBOTH} ] }.play(); Grow và shrink Timeline{ autoReverse:true repeatCount:Timeline.INDEFINITE keyFrames: [ at(0s) {circle.scaleX => 1} at(0s) {circle.scaleY => 1} at(2.5s) {circle.scaleX => 2. tween Interpolator.EASEBOTH} at(2.5s) {circle.scaleY => 2. tween Interpolator.EASEBOTH} ] }.play(); Javafx.animation.transition Transition của JavaFX là những timeline chuyên dụng để làm đơn giản hóa những hoạt ảnh của đối tượng đồ họa. Transition của JavaFX bao gồm những hoạt ảnh : di chuyển, co dãn, xoay , làm mờ. Transition Miêu tả TranslateTransition Di chuyển một node từ vị trí này đến vị trí khác trong một khoảng thờ

Các file đính kèm theo tài liệu này:

  • docdocument.doc
  • pptxBaoCaoJavaFX.pptx
  • docxJavaFX.docx
  • pdfJavaFX.pdf
  • rarTai Lieu SAD.rar
  • rarTai Lieu SRS.rar
Tài liệu liên quan