2011-09-14 19 views
6

Próbowałem powiązać JList z właściwością klasy wiążącej, Vector. W klasie wiążącej aktualizacja Vector jest aktualizowana po zaktualizowaniu interfejsu użytkownika w interfejsie użytkownika.Jak powiązać właściwość JList z klasą Bean

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 
} 

Dostępne są również inne setery do aktualizacji Vector. Ustawiłem również dodać/usunąć PropertyChangeListeners.

Moim rzeczywistym wymaganiem jest aktualizacja JList zgodnie z danymi w klasie BeanBinding. Na przykład, gdy użytkownik wpisze JTextField, odpowiednie dane z bazy danych i istniejących zmiennych w klasie powinny zostać załadowane do JList.

Proszę, niech ktoś mi powie jak powiązać dane klasy BeanBinding (źródło) dla JList w NetBeans. Przynajmniej dowolny link samouczka. W witrynie NetBeans znajduje się próbka, ale służy ona do pobierania danych bezpośrednio z bazy danych.

Odpowiedz

3

Nie wiem nic o Netbeans, tylko o kodzie męskim :-) W tym celu umieść listę w ObservableList i wykonaj wszystkie zmiany w obserwowalnym powinny zadziałać. Oto runnable kod snipped (przepraszam za długość, nie ma energii strip go teraz)

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

} 

Edycja: zastąpiony JXList przez JList (brak różnicy w zachowaniu, tak aby compileable :-)

+0

Bardzo dziękuję :) –

+0

Czy powiedziałbyś, co się stanie, gdy użyjesz ObservableList? –

+0

To, co zrobiłem, to po prostu zapakowałem listę tylko w obserwowalną listę. Działało idealnie. :) Jeszcze raz bardzo dziękuję :) :) –

Powiązane problemy