2012-03-28 71 views
11

Tôi có một ứng dụng có nhiều cửa sổ/chế độ xem hiển thị cùng một đối tượng. Ví dụ tôi có một đối tượng người dùng với tên và vị trí Strings và một ImageIcon cho hình ảnh của họ.Ràng buộc dữ liệu với Java

Sau đó trên cửa sổ của tôi, tôi sẽ sử dụng các chi tiết của đối tượng sử dụng như thế này -

  1. tôi tạo ra một JPanel.
  2. Tôi thêm JLabels vào nó (nameLabel, locationLabel, imageLabel)
  3. Tôi gọi setText() (hoặc setIcon cho imageLabel) cho mỗi nhãn này để đặt văn bản/hình ảnh của họ thành dữ liệu đối tượng người dùng.

tôi phải liên tục làm việc này cho

  1. mỗi cửa sổ, nơi dữ liệu đối tượng người dùng được thể hiện
  2. mỗi khi đối tượng người dùng được thay đổi tôi phải gọi setText() trên nhãn một lần nữa.

Trong C# khi tôi đang sử dụng databinding vì vậy khi tôi cập nhật một đối tượng, nó được tự động phản ánh trong phần tử GUI đã được dữ liệu vào nó. Có cái gì tương tự tồn tại với Java?

+0

xin và câu hỏi của bạn (s) là/khoảng ???, xin vui lòng gửi một [SSCCE] (http://sscce.org/) trình bày vấn đề của bạn (s) với Bindings/DataBinding – mKorbel

+3

Tôi đặt ra chính xác những gì Im đang làm trong danh sách trên. Không phải mọi câu hỏi đều yêu cầu một SSCCE đặc biệt là một câu hỏi như thế mà không hỏi về vấn đề mã. Tôi hỏi nếu databinding là có thể với java bởi vì trong C# nó là cách tiêu chuẩn làm công việc GUI. Tôi đã không tìm thấy bất kỳ mặt trời chính thức xác nhận thông tin dữ liệu java trên google và kết quả google trang đầu tiên tôi nhận được cho 'Java databinding' chứa những thứ như 'api databinding java chưa sẵn sàng cho primetime' và 'Beans Binding: Một giải pháp liên kết dữ liệu Java với một vấn đề nghiêm trọng ' –

+1

thì câu trả lời của bạn có thể là ống thổi hoặc JSR296 – mKorbel

Trả lời

3

Mẫu MVP giúp bạn đạt được điều này. Bạn phải viết các sự kiện tùy chỉnh nâng cao và đính kèm trình nghe UI để trả lời các sự kiện này (mẫu quan sát). Java cung cấp PropertyChangeEvents và PropertyChangeListeners bổ sung cho các hợp đồng Observer và Observable.

3

Có ví dụ trong bài viết Java SE Application Design về ràng buộc dữ liệu.

Xem AbstractModel sử dụng PropertyChangeSupport.

Các lớp cần thông báo rằng đối tượng đã thay đổi sẽ thực hiện PropertyChangeListener (xem AbstractController).

1

Tôi đã mã hóa bằng java và C# trong một thời gian dài và Tôi đã mã hóa propertyChangeListeners của riêng mình bằng Java bằng cách bắt chước .net và dưới đây là phương pháp của tôi.

Để tuần tự hóa đối tượng này, tôi đã mã hóa các bộ lọc đặc biệt chống lại bộ nối tiếp, tức là. XStream, java serialization object

Nếu bạn cần DIY bạn có thể sử dụng theo cách của mình hoặc bạn cũng có thể tiến bộ bằng cách đi qua cơ sở hạ tầng của Oracle như @Pau Kiat Wee liên kết nó trong câu trả lời của mình.

Có một cái nhìn JGoodies cho dữ liệu Swing ràng buộc cho đã hơn được xây dựng trong công cụ http://www.jgoodies.com/download/presentations/binding.pdf http://www.jgoodies.com/downloads/demos/

Đây là thực hiện của tôi,

đối tượng kinh doanh của bạn sẽ được mở rộng từ lớp trừu tượng này.

Chắc chắn, nếu bạn đã mở rộng từ một thứ khác và đây không phải là một trong các tùy chọn này có thể làm việc cho bạn.

thể Hầu hết các bạn không có ý định để serialize propertyChangeListeners đăng ký và gửi một số dữ liệu đến một nơi nào với nó (một dịch vụ từ xa mà không biết UI lớp phụ thuộc của bạn và điều này sẽ là đau đầu) Vì vậy, chúng ta đang bỏ qua serialization Bằng cách này.

Xin lưu ý private void writeObject(java.io.ObjectOutputStream out)private void readObject(java.io.ObjectInputStream in) chữ ký. Tôi cố ý để trống chúng và những chữ ký phương thức quan trọng này được xem xét bởi Java Object Serialization.

Đây là giao diện bắt chước PropertyChangeEvent của chúng tôi, chúng tôi sẽ sử dụng mẫu quan sát để thông báo cho người đăng ký của chúng tôi.

public interface IPropertyChangedListener extends EventListener { 

    public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue); 

} 

Đây là cơ sở của chúng ta về DataBusinessObject

public abstract class DataObjectBase implements Serializable { 


    private List<IPropertyChangedListener> propertyChangeListeners=new ArrayList<IPropertyChangedListener>(); 
    public void addOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener) 
    { 
     ensureRegisterListCreated(); 
     propertyChangeListeners.add(propertyChangeListener); 
    } 

    public void removeOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener) 
    { 
     ensureRegisterListCreated(); 
     propertyChangeListeners.remove(propertyChangeListener); 
    } 

    public DataObjectBase() 
    { 
     ensureRegisterListCreated(); 
    } 

    public void ensureRegisterListCreated() 
    { 
     if(propertyChangeListeners==null) 
      propertyChangeListeners=new ArrayList<IPropertyChangedListener>();  
    } 

    protected void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue) 
    { 
     if(propertyChangeListeners.size()<=0) 
      return; 
     for (IPropertyChangedListener listener : propertyChangeListeners) { 
      listener.onPropertyChanged(source, propertyName, oldValue, newValue); 
     } 
    } 

    private void writeObject(java.io.ObjectOutputStream out) 
      throws IOException 
      { 

      } 

    private void readObject(java.io.ObjectInputStream in) 
       throws IOException { 


       } 

} 

Bây giờ, cho phép sử dụng nó

dataObject.addOnPropertyChangedListener(new IPropertyChangedListener() { 

       @Override 
       public void onPropertyChanged(Object source, String propertyName, 
         Object oldValue, Object newValue) { 
        System.out.println(String.format("%s %s %s",propertyName,oldValue,newValue)); 
//TODO:Fire your UI change now !!! 

       } 
      }); 

Đây là những gì bạn cần làm trong DataObject bạn

public class dataObject extends BaseDataObject 
{ 

    private String editable; 

    public String getEditable() { 
     return editable; 
    } 

    public void setEditable(String isEditable) { 
     String oldValue=this.editable;  
     this.editable = isEditable; 
     onPropertyChanged(this,"Editable",oldValue,isEditable); 
    } 

} 

Nếu bạn không muốn làm theo cách của tôi, hoặc bạn có thể ' t vì lý do nào đó. Bạn nên làm theo JGoodies, điều này có vẻ tốt nhất của tất cả. Trong bản demo tải xuống tệp JNLP và bạn sẽ thấy phần DataBinding. Có phần mã khi bạn bấm vào một mũi tên được đặt lên bên phải. Chúc may mắn! http://www.jgoodies.com/downloads/demos/

0

Sử dụng tập tin betterbeansbinding.jar thay vì beansbinding.jar

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