2015-07-07 16 views
9

Tôi đang phát triển một ứng dụng trong JavaFX nơi tôi muốn đại diện cho thông tin của một cá nhân trong một lớp Person duy nhất. Tôi đã xem qua một hướng dẫn trong đó tên của một Người được đại diện là StringProperty thay vì String. Tôi đã tìm kiếm sự khác biệt này và phát hiện ra thisthis nhưng lời giải thích không đủ để tôi lấy khái niệm. Một số bài đăng trên mạng cho biết có lợi thế khi sử dụng StringProperty trên String nhưng không thể đề cập đến chúng.Khi nào sử dụng StringProperty trên chuỗi?

Bây giờ câu hỏi của tôi là: Điều kiện nào yêu cầu một để sử dụng StringProperty qua String và những lợi ích của việc đó là gì?

Tại sao điều này:

StringProperty firstName;

Over này:

String firstName;

Trả lời

9

Khi nào sử dụng StringProperty firstName over String firstName?

Sử dụng khi biến này firstName sẽ bị người khác quan sát. Bạn cũng có thể quan sát nó bằng cách gắn một người nghe. Bạn có thể sử dụng biến này trong các ràng buộc với các đối tượng quan sát khác của JavaFX. Trong một số trường hợp, bắt buộc phải sử dụng JavaFX Property, như danh sách Person được hiển thị với tableView có thể chỉnh sửa được. Để phản ánh các thay đổi ngay lập tức trong ô đã chỉnh sửa, trường liên kết bên dưới phải là thuộc tính.

+0

thẳng đến giải thích điểm !!! – JWizard

7

JavaFX cố gắng để cho phép các MVC-Pattern. Mô hình sẽ được tạo với Thuộc tính để tận dụng lợi thế của Ràng buộc. Trong trường hợp của bạn, Model là lớp Person, vì vậy bạn chỉ cần thêm FirstName StringProperty. Nhưng trong JavaFX bạn phải chăm sóc các quy ước đặt tên khác như cho getter đơn giản và setter trong một Bean Pojo.

Naming Convention cho Properties trong JavaFX là:

public class Person { 
    private StringProperty firstName; 
    public void setFirstName(String value) { firstNameProperty().set(value); } 
    public String getFirstName() { return firstNameProperty().get(); } 
    public StringProperty firstNameProperty() { 
     if (firstName == null) firstName = new SimpleStringProperty(this, "firstName"); 
     return firstName; 
    } 

    private StringProperty lastName; 
    public void setLastName(String value) { lastNameProperty().set(value); } 
    public String getLastName() { return lastNameProperty().get(); } 
    public StringProperty lastNameProperty() { 
     if (lastName == null) lastName = new SimpleStringProperty(this, "lastName"); 
     return lastName; 
    } 
} 

Sau đó bạn có thể để ràng buộc ví dụ như một TableColumn của một TableView đến tài sản "LastName"

TableView<Person> table = new TableView<Person>(); 

ObservableList<Person> teamMembers = getTeamMembers(); 
table.setItems(teamMembers); 

TableColumn<Person,String> lastNameCol = new TableColumn<Person,String>("Last Name"); 
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName")); 

Nếu không có một tài sản này sẽ có nhiều mã hơn và bạn sẽ không có lợi thế khi triển khai hỗ trợ ChangeListener/InvalidationListener.

Ví dụ trên xuất phát từ JavaFX TableView

Vì vậy, cách khuyến khích trong việc đưa ra một mô hình cho JavaFX đang sử dụng JavaFX-Properties và không xây dựng trong các loại.

+0

Vì vậy, có vẻ như điều này cung cấp một số tiện ích mở rộng cho JavaBeans? – JWizard

+0

Vâng, đó chính là cách nó được triển khai. Xem [hướng dẫn] (http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#JFXBD107) –

Các vấn đề liên quan