<Swing Dev> 6179357: Generics: JList: Constructors & Model

Florian Brunner fbrunnerlist at gmx.ch
Wed Mar 11 22:32:27 UTC 2009


This one is still open...
Opinions?

-Florian

Am Donnerstag, 26. Februar 2009 schrieb Florian Brunner:
> So, which approach do we take? I'm tending now more towards approach 1) but
> approach 2) would be fine for me, too?
>
> Pavel? Anyone else?
>
> -Florian
>
> Am Samstag, 21. Februar 2009 schrieb Florian Brunner:
> > In the case of JComboBox I think it's not even possible to define
> > something like:
> >
> >  class JComboBox<E>{
> >  ComboBoxModel<? extends E> getModel();
> >  setModel(ComboBoxModel<? extends E>);
> >  }
> >
> > because JComboBox internally uses the ComboBoxModel.setSelectedItem
> > method.
> >
> > So the question is what do you think is better:
> >
> > 1) To look at each component individually and try to make each as
> > flexible as possible. So in the JList/ JComboBox case this would mean:
> >
> >  class JList<E>{
> >  ListModel<? extends E> getModel();
> >  setModel(ListModel<? extends E>);
> >  }
> >
> > but
> >
> >  class JComboBox<E>{
> >  ComboBoxModel<E> getModel();
> >  setModel(ComboBoxModel<E>);
> >  }
> >
> > 2) Make the interfaces as consistent as possible over all components.
> > This would mean for the JList case to use somethink like:
> >  class JList<E>{
> >  ListModel<E> getModel();
> >  setModel(ListModel<E>);
> >  }
> >
> > This approach is slightly less flexible than the approach 1), but cases
> > where one could benefit from approach 1) are probably rare and there are
> > various work-arounds (like: wrapping the model/ use a common base class
> > for the generic parameter/ use raw type/... )
> >
> > So what do you think? Approach 1) or 2)?
> >
> > -Florian
> >
> > Am Donnerstag, 19. Februar 2009 schrieb Florian Brunner:
> > > Well, there is probably no big issue with JList, because the ListModel
> > > is immutable.
> > >
> > > But when we add generics to JComboBox, which is similar to JList, the
> > > situation is a bit more controversial, because the ComboBoxModel is
> > > mutable.
> > >
> > > So if we have something like this:
> > > class JComboBox<E>{
> > > ComboBoxModel<? extends E> getModel();
> > > setModel(ComboBoxModel<? extends E>);
> > > }
> > >
> > > then something like this is not possible:
> > > JComboBox<Foo> cb = new JComboBox<Foo>(...);
> > > ...
> > > Foo foo;
> > > ComboBoxModel<? extends Foo> model = cb.getModel();
> > > model.setSelectedItem(foo); -> compile time error
> > >
> > > You would need to do an unchecked (-> not type-safe) cast first:
> > > ComboBoxModel<Foo> model = (ComboBoxModel<Foo>) cb.getModel();
> > >
> > > And type-safty is what generics is all about.
> > >
> > > -Florian
> > >
> > > Am Dienstag, 3. Februar 2009 schrieb Pavel Porvatov:
> > > > Hi Florian,
> > > >
> > > > > ----------------------------------------
> > > > >
> > > > > public JList(ListModel dataModel)
> > > > >
> > > > > {
> > > > >
> > > > > if (dataModel == null) {
> > > > >
> > > > > throw new IllegalArgumentException("dataModel must be non null");
> > > > >
> > > > > }
> > > > >
> > > > > // Register with the ToolTipManager so that tooltips from the
> > > > >
> > > > > // renderer show through.
> > > > >
> > > > > ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
> > > > >
> > > > > toolTipManager.registerComponent(this);
> > > > >
> > > > > layoutOrientation = VERTICAL;
> > > > >
> > > > > this.dataModel = dataModel;
> > > > >
> > > > > selectionModel = createSelectionModel();
> > > > >
> > > > > setAutoscrolls(true);
> > > > >
> > > > > setOpaque(true);
> > > > >
> > > > > updateUI();
> > > > >
> > > > > }
> > > > >
> > > > > --->
> > > > >
> > > > > public JList(ListModel<E> dataModel)
> > > > >
> > > > > {
> > > > >
> > > > > if (dataModel == null) {
> > > > >
> > > > > throw new IllegalArgumentException("dataModel must be non null");
> > > > >
> > > > > }
> > > > >
> > > > > // Register with the ToolTipManager so that tooltips from the
> > > > >
> > > > > // renderer show through.
> > > > >
> > > > > ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
> > > > >
> > > > > toolTipManager.registerComponent(this);
> > > > >
> > > > > layoutOrientation = VERTICAL;
> > > > >
> > > > > this.dataModel = dataModel;
> > > > >
> > > > > selectionModel = createSelectionModel();
> > > > >
> > > > > setAutoscrolls(true);
> > > > >
> > > > > setOpaque(true);
> > > > >
> > > > > updateUI();
> > > > >
> > > > > }
> > > > >
> > > > > We could define the signature also like this:
> > > > >
> > > > > public JList(ListModel<? extends E> dataModel)
> > > > >
> > > > > but then we would have to define the dataModel-field also with:
> > > > >
> > > > > private ListModel<? extends E> dataModel
> > > > >
> > > > > as well as the model-property. I don't think this would be a good
> > > > > idea and thus define the signature as:
> > > > >
> > > > > public JList(ListModel<E> dataModel)
> > > > >
> > > > > What do you think?
> > > >
> > > > Why do you think that "private ListModel<? extends E> dataModel" is
> > > > not a very good idea?
> > > >
> > > > Regards, Pavel





More information about the swing-dev mailing list