6

JListをバインディングクラスプロパティにバインドしようとしましたVector。バインディングクラスではVectorJTextFieldUIが更新されるとが更新されます。

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データに従って更新することです。BeanBindingたとえば、ユーザーがを入力JTextFieldする場合、データベースからの関連データとクラス内の既存の変数をにロードする必要がありますJList

NetBeansBeanBindingでのデータクラス(ソース)プロパティをバインドする方法を教えてください。JList少なくともチュートリアルリンク。NetBeansサイトにサンプルがありますが、これはデータベースから直接データを取得するためのものです。

4

1 に答える 1

3

Netbeans については知りません。単純なコーディングです :-) その中で、リストを ObservableList にラップし、observable ですべての変更を行う必要があります。これは実行可能なコードの抜粋です (長くて申し訳ありません。今はそれを削除するエネルギーがありません)。

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

}

編集:JXListをJListに置き換えました(コンパイル可能にするためだけに、動作に違いはありません:-)

于 2011-09-14T07:48:28.777 に答える