【问题标题】:JGoodies Binding: binding an object with JCombobox and default valuesJGoodies Binding:使用 JCombobox 和默认值绑定对象
【发布时间】:2012-12-10 15:57:26
【问题描述】:

我有以下问题:

我想在我的视图中将一个 JCombobox 与我的模型“DomainModel”绑定,以便以后可以使用“AnotherModel”获取它。getModel();

我写了一个自己的 CellRenderer 让它看起来像“ID - Name”。但是当我选择 Combobox 的值并调用 'AnotherModel'.getModel 时,该值不会保存在其中。

难道不能用 JGoodies Bindings 来绑定复杂的数据类型吗?使用 String 可以正常工作,但我想绑定 'DomainModel' 的对象

这是简化的代码:

观点:

public class View extends JPanel {

    private JComboBox<DomainModel> cmbValueModel;

    public View(AntotherModel antotherModel,  List<DomainModel> manyDomainModels) {

    PresentationModel<DomainModel> domainModel = new PresentationModel<DomainModel>();
    domainModel.setBean(antotherModel.getModel());

    cmbValueModel = BasicComponentFactory.createComboBox(new SelectionInList<DomainModel>(manyDomainModels, domainModel.getModel(DomainModel.PROPERTYNAME_NAME)));

    Bindings.bind(cmbValueModel, new SelectionInList<>(), "");
    cmbValueModel.setRenderer(new DefaultListCellRenderer(){

        @Override
        public Component getListCellRendererComponent(JList<?> list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus) {

            return super.getListCellRendererComponent(list, value == null ? null : ((DomainModel)value).getId() + " - " + ((DomainModel)value).getName() , index, isSelected,
                    cellHasFocus);
        }

    });

    }

}

域名:

public class DomainModel extends Model{

public static final String PROPERTYNAME_NAME = "name";

@GeneratedValue
private int id;
private String name;

public void setName(String name) {
    String oldVal = this.name;
    this.name = name;
    changeSupport.firePropertyChange(PROPERTYNAME_NAME, oldVal, name);
}

public String getName(){
    return name;
}

public int getId(){
    return id;
}

}

另一个模型:

    public class AntotherModel extends Model{

        public static final String PROPERTYNAME_MODEL = "model";

        private int id;
        private DomainModel model;


        public int getId() {
            return id;
        }
        public DomainModel getModel() {
            return model;
        }
        public void setId(int id) {
            this.id = id;
        }
        public void setModel(DomainModel model) {
            DomainModel oldVal = this.model;
            this.model = model;
            changeSupport.firePropertyChange(PROPERTYNAME_MODEL, oldVal, model);
        }



    }

【问题讨论】:

    标签: java swing data-binding jcombobox jgoodies


    【解决方案1】:

    您的代码无法编译或运行,因此很难弄清楚您要做什么。如果这是您所追求的,下面的示例显示一个组合框绑定到 DomainModels 列表;您可以将 valueChangeListener 添加到 selectionInList 以在用户更改选择时执行某些操作。高温

    import java.awt.Component;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    
    import com.jgoodies.binding.adapter.BasicComponentFactory;
    import com.jgoodies.binding.list.SelectionInList;
    
    public class View extends JPanel {
    
        private JComboBox comboBox;
    
        public View(AnotherModel anotherModel, List<DomainModel> manyDomainModels) {
            final SelectionInList<DomainModel> selectionInList = new SelectionInList<DomainModel>(manyDomainModels);
            comboBox = BasicComponentFactory.createComboBox(selectionInList);
    
            comboBox.setRenderer(new DefaultListCellRenderer() {
                @Override
                public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                    return super.getListCellRendererComponent(list, value == null ? null : ((DomainModel) value).getId() + " - "
                        + ((DomainModel) value).getName(), index, isSelected, cellHasFocus);
                }
            });
    
            add(comboBox);
        }
    
        public static void main(String[] args) {
            final JFrame frame = new JFrame();
            final AnotherModel anotherModel = new AnotherModel();
            final List<DomainModel> manyDomainModels = new ArrayList<DomainModel>();
            final DomainModel domainModel1 = new DomainModel();
            domainModel1.setName("foo");
            final DomainModel domainModel2 = new DomainModel();
            domainModel2.setName("bar");
            final DomainModel domainModel3 = new DomainModel();
            domainModel3.setName("baz");
            manyDomainModels.add(domainModel1);
            manyDomainModels.add(domainModel2);
            manyDomainModels.add(domainModel3);
            frame.getContentPane().add(new View(anotherModel, manyDomainModels));
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2011-07-22
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多