2011-09-14 44 views
6

tôi đã cố gắng để ràng buộc một JList để sở hữu một lớp liên kết, Vector. Trong lớp liên kết, các Vector được cập nhật khi một JTextField trong giao diện người dùng được cập nhật.Làm thế nào để ràng buộc một JList để một Bean sở hữu lớp

public void setName(String name) { 
    String oldName = this.name; 
    this.name = name; 
    Vector oldList=this.list; 
    list.add(name); 
    propertySupport.firePropertyChange("name", oldName, this.name); //textField updates 
    propertySupport.firePropertyChange(PROP_LIST, oldList, list); // JList 
} 

Cũng có một bộ chia riêng biệt khác để cập nhật Vector. Tôi cũng đã thiết lập thêm/loại bỏ PropertyChangeListeners.

Yêu cầu thực sự của tôi là cập nhật JList theo dữ liệu trong lớp BeanBinding. Ví dụ, khi người dùng nhập vào JTextField, dữ liệu có liên quan từ cơ sở dữ liệu và các biến tồn tại trong lớp nên được nạp vào JList.

Vui lòng cho tôi biết cách liên kết dữ liệu BeanBinding thuộc tính lớp (nguồn) cho số JList trong NetBeans. Ít nhất là bất kỳ liên kết hướng dẫn nào. Có một mẫu trong trang NetBeans, nhưng nó là để lấy dữ liệu trực tiếp từ cơ sở dữ liệu.

Trả lời

3

Không biết về Netbeans, chỉ tầm thường :-) mã hóa Trong đó, quấn danh sách của bạn thành một ObservableList và làm tất cả những thay đổi trên quan sát nên làm việc. Dưới đây là một mã Runnable snipped (xin lỗi vì sự dài, không còn đủ sức lực để tách nó xuống ngay bây giờ)

public class SimpleListBinding { 
    @SuppressWarnings("unused") 
    private static final Logger LOG = Logger 
      .getLogger(SimpleListBinding.class.getName()); 
    private JComponent content; 
    private JList list; 
    private JTextField textField; 

    private List<MyBean> beanList; 
    private JButton modifyButton; 
    private JButton addButton; 


    /** 
    * Binds list and simple properties. 
    */ 
    private void bindBasics() { 
     BindingGroupBean context = new BindingGroupBean(); 
     JListBinding listBinding = SwingBindings.createJListBinding(UpdateStrategy.READ_WRITE, 
       beanList, list); 
     listBinding.setDetailBinding(BeanProperty.create("value")); 
     context.addBinding(listBinding); 
     context.addBinding(Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, 
       list, BeanProperty.create("selectedElement.value"), 
       textField, BeanProperty.create("text"))); 
     context.bind(); 
     Action action = new AbstractAction("programatically change") { 
      public void actionPerformed(ActionEvent e) { 
       int selectedBean = list.getSelectedIndex(); 
       if (selectedBean < 0) return; 
       MyBean bean = beanList.get(selectedBean); 
       bean.setValue(bean.getValue() + "*"); 
      } 

     }; 
     modifyButton.setAction(action); 

     Action add = new AbstractAction("add bean") { 
      int count = 0; 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       beanList.add(new MyBean("added: " + count++)); 
      } 

     }; 
     addButton.setAction(add); 
    } 

    private void initData() { 
     MyBean[] beans = new MyBean[] { 
       new MyBean("first"), new MyBean("second"), new MyBean("third") 
     }; 
     beanList = ObservableCollections.observableList(new ArrayList(Arrays.asList(beans))); 
    } 

    public static class MyBean extends AbstractBean { 
     private String value; 
     private boolean active; 
     public MyBean(String value) { 
      this.value = value; 
     } 
     public String getValue() { 
      return value; 
     } 

     public void setValue(String value) { 
      Object old = getValue(); 
      this.value = value; 
      firePropertyChange("value", old, getValue()); 
     } 

     public void setActive(boolean active) { 
      boolean old = getActive(); 
      this.active = active; 
      firePropertyChange("active", old, getActive()); 
     } 

     public boolean getActive() { 
      return active; 
     } 
    } 

    private JComponent getContent() { 
     if (content == null) { 
      initComponents(); 
      content = build(); 
      initData(); 
      bindBasics(); 
     } 
     return content; 
    } 

    private JComponent build() { 
     JComponent comp = Box.createVerticalBox(); 
     comp.add(new JScrollPane(list)); 
     comp.add(textField, BorderLayout.SOUTH); 
     comp.add(modifyButton); 
     comp.add(addButton); 
     return comp; 
    } 

    private void initComponents() { 
     list = new JList(); 
     textField = new JTextField(); 
     modifyButton = new JButton("modify programmtically"); 
     addButton = new JButton(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       final JXFrame frame = new JXFrame("List binding", true); 
       frame.add(new SimpleListBinding().getContent()); 
       frame.pack(); 
       frame.setSize(400, 300); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

Sửa: thay thế JXList bởi JList (có sự khác biệt trong hành vi, chỉ để làm cho nó compileable :-)

+0

Thank you very much :) –

+0

bạn có biết những gì sẽ xảy ra khi ObservableList được sử dụng? –

+0

Những gì tôi đã làm là tôi chỉ quấn danh sách của tôi chỉ trong observableList. Nó hoạt động hoàn hảo. :) Một lần nữa, cảm ơn bạn rất nhiều :) :) –

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