2011-09-14 1 views
6

JList을 바인딩 클래스 속성 인 Vector에 바인딩하려고했습니다. 바인딩 클래스에서 UI의 JTextField이 업데이트되면 Vector이 업데이트됩니다.JList를 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 
} 

Vector을 업데이트하는 또 다른 별도의 설정기를 사용할 수 있습니다. PropertyChangeListeners 추가/제거를 설정했습니다.

내 실제 요구 사항은 클래스의 데이터에 따라 JList을 업데이트하는 것입니다. 예를 들어 사용자가 JTextField을 입력하면 데이터베이스의 관련 데이터와 클래스의 기존 변수를 JList에로드해야합니다.

NetBeans에서 BeanBinding 클래스 (소스) 속성을 JList에 바인드하는 방법을 알려주십시오. 적어도 튜토리얼 링크. NetBeans 사이트에는 샘플이 있지만 데이터베이스에서 직접 데이터를 가져 오는 데 사용됩니다.

답변

3

Netbeans에 대해 잘 모르겠다. 즉, 간단한 코딩 만하면된다 :-) 당신의 목록을 ObservableList로 감싸고 관찰 가능 항목에 대한 모든 변경이 이루어져야한다. 여기 냈다 실행 가능한 코드

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

} 

편집을 (길이 미안 지금 그것을 아래로 제거 할 수있는 에너지를 가지고하지 않습니다)입니다 : 그냥 compileable하기 위해, JList의 (행동에 어떤 차이 JXList 교체 :-)

+0

대단히 감사합니다. –

+0

ObservableList가 사용될 때 어떤 일이 일어날 것이라고 말합니까? –

+0

내가 한 것은 observableList에서만 내 목록을 감쌌다는 것입니다. 그것은 완벽하게 작동했습니다. :) 다시 한번 고마워요 :)) :) –