2011-09-14 27 views
6

Bir JList bağlama sınıfına Vector bağlamaya çalıştım. Ciltleme sınıfında, Vector, UI'deki bir JTextField güncelleştirildiğinde güncelleştirilir.Bean sınıfına bir JList nasıl bağlanır

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 
} 

Ayrıca başka bir ayrı ayarlayıcı Vector güncellenmesi için kullanılabilir. Ben de PropertyChangeListeners eklemek/kaldırmak ayarlamak.

Benim gerçek gereksinim JList sınıfındaki BeanBinding sınıfındaki verilere göre güncelleştirmektir. Örneğin, kullanıcı JTextField'da yazdığında, veritabanından ilgili veriler ve sınıftaki mevcut değişkenler JList'a yüklenmelidir.

Lütfen, herhangi biri bana JList NetBeans öğesinde BeanBinding sınıf (kaynak) özelliğini nasıl bağlayacağımı bildirin. En azından herhangi bir eğitim bağlantısı. NetBeans sitesinde bir örnek var, ancak doğrudan veri tabanından veri almak içindir.

cevap

3

Netbeans hakkında bir şey bilmiyoruz, sadece meni kodlayan :-) Bu yüzden, listenizi bir ObservableList'e sarın ve gözlemlenebilir tüm değişikliklerin çalışmasını sağlayın. İşte snipped bir çalıştırılabilir kod

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); 
      } 
     }); 
    } 

} 

Edit (uzunluk için üzgün şu anda aşağı şerit enerjim yok,) var: sadece compileable yapmak için, JList (davranışında hiçbir farkından JXList yerini :-)

+0

Çok teşekkür ederim :) –

+0

ObservableList kullanıldığında ne olacağını söyler misiniz? –

+0

Ne yaptım sadece listemi sadece gözlemlenebilirListeme geçirdim. Mükemmel çalıştı. :) Bir kez daha Çok teşekkür ederim:):) –