Thứ Ba, 16 tháng 9, 2014

[JavaFX 8] Phần 5 : Sử dụng JavaFX Collections

Phần 5 : Sử dụng JavaFX Collections
JavaFX collections được kế thừa từ Java Collections. Java Collections bao gồm 4 interface chính : List, Set , Map , Collection.
I. Java Collections :
Trong phần này, chúng ta sẽ tìm hiểu sơ qua ý nghĩa và cách sử dụng Java  Collections dựa trên 4 interface chính là : List, Set, Map, Collection.
1.  List và Set:
List, Set là một tập hợp các đối tượng theo thứ tự, được miêu tả bằng java.util.List interface. Các đối tượng trong List và Set được gọi là elements (phần tử) , tuy nhiên :
- List có thể chứa các phần tử trùng nhau.
- Set không thể chứa các phần tử trùng nhau, các phần tử trong Set là duy nhất.

Ngoài tính năng trên, thì List và Set hoạt động giống nhau. List và Set interface định nghĩa một số phương thức cho phép : thêm, xóa, sửa và truy cập các phần tử trong nó.
Class thường dùng cho List là : ArrayListVector.  Cách sử dụng ArrayList và Vector hoàn toàn giống nhau. Về mặt ý nghĩa, Vector là Synchronized nên thường được dùng trong các ứng dụng mạng hoặc đa luồng. ArrayList là Asynchronism. Vì thế, Vector xử lý chậm hơn ArrayList.
Class thường dùng cho Set  là : HashSet.
Cách sử dụng List:
2. Map:
Map là một tập hợp các phần tử. Mỗi phần tử của Map bao gồm : 1 Key và 1 Value. Key và Value là bất kỳ đối tượng nào của Java. Map không thể chứa 2 Key trùng nhau. Bạn không thể truy cập trực tiếp Value mà phải thông qua Key.
Class thường dùng cho Map : HashMap, Hashtable. Cách sử dụng các class này hoàn toàn giống nhau. Về mặt ý nghĩa, Hashtable là Synchronized nên thường được dùng trong các ứng dụng mạng hoặc đa luồng. HashMap là Asynchronism. Vì thế, Hashtable xử lý chậm hơn HashMap.
Cách sử dụng  Map:
3. Collections :
Collections class bổ sung 1 số phương thức kiểu Static dành cho List, Set và Map.
Cách sử dụng  Collections:
II. JavaFX Collections:
JavaFX collections kế thừa từ Java Collections và được định nghĩa trong javafx.collections  packet.
Hình trên cho thấy JavaFX Collections được kế thừa từ :
  • Java Collections : mang đầy đủ bản chất của Java Collection.
  • Observable : bổ sung tính năng cho phép đăng ký  Listerner.  
1. ObservableList:
ObservableList là 1 tập hợp các đối tượng mà cho phép đăng ký Listener để theo dõi khi có sự thay đổi xảy ra trên tập hợp, như : xóa, thêm, sửa các phần tử.
Khi ObservableList đăng ký Listener thì ListChangeListener interface sẽ nhận trực tiếp thông báo về sự thay đổi của ObservableList.
a. Cách sử dụng ObservableList :
b. Một số phương thức của ObservableList :
kiểu trả về
Phương thức
Miêu tả
void
add(E elements)
Thêm 1 phần tử vào ObservableList.
boolean
addAll(E…. elements)
Thêm nhiều phần tử vào ObservableList.
Vd: olist.addAll(“e1”,”e2”,…,);
void
addListener(
ListChangeListener listener)
Đăng ký Listener.
void
removeListener (ListChangeListener listener)
Xóa 1 đăng ký Listener.
void
remove(int value)
Xóa 1 phần tử
void
remove(int from, int to)
Xóa nhiều phần tử từ vị trí from .. đến vị trí to
void
set(int location, E element)
Cập nhật phần tử tại vị trí location.
void
setAll(E.. elements)
Xóa tất cả phần tử hiện có và thay thế bằng các phần tử trong phương thức setAll().
boolean
retainAll(E.. elements)
Xóa tất cả các phần tử trừ những phần tử nằm trong danh sách của phương thức retainAll().
void
clear()
Xóa tất cả phần tử trong ObservableList.
int
size()
Số các phần tử có trong ObservableList.

c. Ví dụ :
Tạo 1 ObservableList và 1 Button, khi bấm vào button sẽ tự động thêm 1 phần tử mới vào ObservableList.

public class ExampleCollections extends Application {
   int i=0;
   
   @Override
   public void start(Stage primaryStage) {
       ObservableList<String> observableList = FXCollections.observableArrayList();
      
       observableList.addListener(new ListChangeListener() {
           @Override
           public void onChanged(ListChangeListener.Change c) {
               System.out.println("Phần tử thay đổi : " + c );
               System.out.println("hiển thị lại list : " + observableList);
           }
       });
       
       Button btn = new Button();
       btn.setText("Thêm phần tử vào List");
       btn.setOnAction(new EventHandler<ActionEvent>() {
           @Override
           public void handle(ActionEvent event) {
               i++;
               observableList.add("element" + i);
           }
       });

       StackPane root = new StackPane();
       root.getChildren().add(btn);
       Scene scene = new Scene(root, 300, 250);
       primaryStage.setTitle("Hello World!");
       primaryStage.setScene(scene);
       primaryStage.show();
   }
   /**
    * @param args the command line arguments
    */
   public static void main(String[] args) {
       launch(args);
   }
}
2. ObservableSet:
ObservableSet tương tự như ObservableList, cũng là 1 tập hợp các đối tượng mà cho phép đăng ký Listener để theo dõi khi có sự thay đổi xảy ra trên tập hợp, như : xóa, thêm, sửa các phần tử.
Lưu ý : Các phần tử trong ObservableSet là duy nhất không được trùng nhau.

Khi ObservableSet đăng ký Listener thì SetChangeListener interface sẽ nhận trực tiếp thông báo về sự thay đổi của ObservableSet.
a. Cách sử dụng ObservableSet :
b. Một số phương thức của ObservableSet :

kiểu trả về
Phương thức
Miêu tả
void
add(E elements)
Thêm 1 phần tử vào ObservableSet.
boolean
addAll(E…. elements)
Thêm nhiều phần tử vào ObservableSet.
void
addListener(
SetChangeListener listener)
Đăng ký Listener.
void
removeListener (SetChangeListener listener)
Xóa 1 đăng ký Listener.
void
remove(int value)
Xóa 1 phần tử
void
remove(int from, int to)
Xóa nhiều phần tử từ vị trí from .. đến vị trí to
void
set(int location, E element)
Cập nhật phần tử tại vị trí location.
void
setAll(E.. elements)
Xóa tất cả phần tử hiện có và thay thế bằng các phần tử trong phương thức setAll().
boolean
retainAll(E.. elements)
Xóa tất cả các phần tử trừ những phần tử nằm trong danh sách của phương thức retainAll().
void
clear()
Xóa tất cả phần tử trong ObservableSet.
int
size()
Số các phần tử có trong ObservableSet.
3. ObservableMap:
ObservableMap là một tập hợp các phần tử mà phép đăng ký Listener để theo dõi khi có sự thay đổi xảy ra trên tập hợp . Mỗi phần tử của ObservableMap bao gồm : 1 Key và 1 Value. Key và Value là bất kỳ đối tượng nào của Java. ObservableMap không thể chứa 2 Key trùng nhau. Bạn không thể truy cập trực tiếp Value mà phải thông qua Key.

Khi ObservableSet đăng ký Listener thì MapChangeListener interface sẽ nhận trực tiếp thông báo về sự thay đổi của ObservableMap.
a. Cách sử dụng ObservableMap:
b. Một số phương thức của ObservableMap:

kiểu trả về
Phương thức
Miêu tả
boolean
containsKey(Object  key)
Trả về true nếu ObservableMap có chứa key chỉ ra.
boolean
containsValue(Object value)
Trả về true nếu ObservableMap có chứa value  chỉ ra.
void
addListener(
MapChangeListener listener)
Đăng ký Listener.
void
removeListener (MapChangeListener listener)
Xóa 1 đăng ký Listener.
Object
get(Objec key)
Trả về đối tượng  Value dựa trên key  chỉ ra.
Object
put(Object key, Object value)
Thêm 1 phần tử vào ObservableMap.
boolean
putAll(Map m)
Thêm các  phần tử của đối tượng Map vào ObservableMap.
void
remove(oject key)
Xóa 1 phần tử dựa trên Key chỉ ra.
object
replace(Object Key, Object value )
Tìm và thay thế đối tượng Value của Key chỉ ra.
void
clear()
Xóa tất cả phần tử trong ObservableMap.
int
size()
Số các phần tử có trong ObservableMap

4. FXCollections:
FXCollections tương tự như Java Collections, ý nghĩa là  bổ sung 1 số phương thức kiểu Static dành cho ObservableList, ObservableSet và ObservableMap.
a. Cách sử dụng FXCollections:
b. Một số phương thức của FXCollections:

kiểu trả về
Phương thức
Miêu tả
static ObservableList
checkedObservableList( ObservableList  olist , java.lang.Class type)
Tạo ra 1 ObservableList mới đồng bộ với olist, tức là sự thay đổi của olist hoặc ObservableList mới này đều đồng bộ với ObservableList  còn lại.  Kiểu type chỉ ra kiểu dữ liệu của mỗi phần tử trong ObservableList mới.
 
Vd:
ObservableList olist1 = FXCollections. checkedObservableList( olist , String.class);
static ObservableSet
checkedObservableSet( ObservableSet  oSet , java.lang.Class type)
Tạo ra 1 ObservableSet mới đồng bộ với oSet, tức là sự thay đổi của oSet hoặc ObservableSet mới này đều đồng bộ với ObservableSet  còn lại.  Kiểu type chỉ ra kiểu dữ liệu của mỗi phần tử trong ObservableSet mới.
static ObservableMap
checkedObservableMap( ObservableList  oMap , java.lang.Class Keytype, java.lang.Clasd Valuetype)
Tạo ra 1 ObservableMap mới đồng bộ với oMap , tức là sự thay đổi của oMap hoặc ObservableMap mới này đều đồng bộ với ObservableMap còn lại.  Kiểu Keytype, Valuetype chỉ ra kiểu dữ liệu cho Key và Value của  mỗi phần tử trong ObservableMap mới.
static ObservableList
concat( ObservableList<E> … lists)
Kết hợp nhiều ObservableList lại thành 1 ObservableList.
Static void
copy(ObservableList dest, java.util.List src)
Copy tất cả các phần tử từ src vào dest.
static ObservableList
observableArrayList()
Tạo 1 ObservableList rỗng.
static ObservableList
observableArrayList( List list)
Tạo 1 ObservableList có các phần tử từ list.
static ObservableList
observableList(List list)
Tạo 1 ObservableList có các phần tử từ list.
static ObservableSet
observableSet(Set set)
Tạo 1 ObservableSet có các phần tử từ set.
static ObservableMap
observableHashMap()
Tạo 1 ObservableMap rỗng.
static ObservableMap
observableHashMap( Map map )
Tạo 1 ObservableMap có các phần tử từ map .
static ObservableIntegerArray
observableIntegerArray ()
Tạo 1 ObservableIntegerArray (mảng) rỗng có các phần tử kiểu Integer.
static ObservableIntegerArray
observableIntegerArray (int… values)
Tạo 1 ObservableIntegerArray (mảng) có các phần tử kiểu Integer.
static ObservableIntegerArray
observableIntegerArray
(observableIntegerArray array)
Tạo 1 ObservableIntegerArray (mảng) có các phần tử kiểu Integer được copy từ array.
static ObservableFloatArray
observableFloatArray()
Tạo 1 ObservableFloatArray  (mảng) rỗng có các phần tử kiểu Float.
static ObservableFloatArray
observableFloatArray (int… values)
Tạo 1 ObservableFloatArray  (mảng) có các phần tử kiểu Float.
static ObservableFloatArray
observableFloatArray (ObservableFloatArray   array)
Tạo 1 ObservableFloatArray  (mảng) có các phần tử kiểu Float  được copy từ array.
static boolean
replaceAll( ObservableList  olist, Object oldVal, Object newVal)
Tìm và thay thế các phần tử oldVal thành newVal trong olist
static void
reverse( ObservableList  olist )
Đảo ngược vị trí các phần tử trong olist
static void
rotate(ObservableList  olist, int distance)
Dịch chuyển tất cả các phần tử sang vị trí (hiện tại + distance).
static void
sort(ObservableList  olist)
Sắp xếp các phần tử trong list theo chiều tăng dần
static void
sort(ObservableList  olist, java.util.Comparator c)
Sắp xếp các phần tử trong list theo định dạng comparator c.

2 nhận xét: