New Proposals for Symbol Support In Charts

Mark Fortner phidias51 at gmail.com
Thu Mar 14 10:32:35 PDT 2013


At Sven's request, I'm spinning off a new thread for these discussions.

*John Smith:* My thought was the default implementation of the
SymbolFactory would do no more or less than is currently done.  But would
provide an injection point where a developer could provide new Symbols.  So
if you want to create a "Series only, No Data" symbol, then you would
simply provide the appropriate factory to do so.

That said, the *layoutPlotChildren* method would need to "come out of the
closet".  There's a lot of magic that happens in that method and that magic
makes it possible to really customize what can be placed in a chart.

In my case, I ended up creating a hacked version of the LineChart with
support for injectable symbol decorators.  This made it possible to create
data-dependent symbols.  In my case, the appearance of the symbol varied a
lot depending on the user object associated with the data.  The symbols had
support for mouse over events, on-click events, and could listen for drag
events within the chart (used to select multiple symbols within a chart).

One example of customization involved a standard symbol which appeared with
a vertical line through it, if the data object indicated that there was a
search hit for it.  The same symbol might also have a fill color if the
node was selected.  A single series might have data objects that have all
or none of these decorations associated with them.  It was only afterward
when I looked at the code again that a light went off and I thought, "that
would be easier to do in the future with a customizable symbol factory".

The "symbols in legends" use case that you mentioned, sounds more like a
LegendItem.  http://javafx-jira.kenai.com/browse/RT-28409


*Sven:*  The symbol factory could produce series-specific symbols depending
on the user's implementation.  I don't see any reason why the user
shouldn't be able to create a symbol factory that contains a list of symbol
factories which match the i'th series with the i'th symbol factory (if
that's what you're after).

I'm not sure how well the symbol factory approach would work for fxml in
general.  But from a programmatic point of view it would make things
easier.  How do the current cell factories work with fxml?

Having a setter for the symbol factory in XYChart would allow for
customization of the symbol factory in the controller code. This way you
could still do your layout work in SceneBuilder, and customize
series-dependent, and data-dependent symbols in the controller.

I don't mind having other symbol factory implementations in jfxtras, but
 basic support for symbol factories themselves, would need to be in the
charts API in order to make that feasible.

As for memory consumption, I think the existing API has nodes per symbol.
 And nodes are added and removed as series and data are added and removed.

It might be interesting to see what people come up with for implementations
of the factory to see what kind of variations one could expect, and see if
there are any cases that wouldn't be easily supported.


Cheers,

Mark



On Wed, Mar 13, 2013 at 5:55 PM, John Smith <John_Smith at symantec.com> wrote:

> There are symbols in legends, which don't have data items and sometimes
> users want these symbols styled differently from symbols marking data
> points in charts.
>
> Mark, in your proposal, would you invoke something like the code below to
> get the legend symbol for a series?
>   ISymbol legendSymbolForSeries1 = factory.getSymbol(series1, null);
>
> Also, on style, is there a precedence for prefixing interface names with I
> in the JavaFX code?
>
> ---------
>
> I do like the idea of some kind of factory mechanism to customize chart
> symbols.
>
> There have been numerous questions on forums related to chart symbol (and
> legend and line) customization.
>
> https://forums.oracle.com/forums/thread.jspa?threadID=2411524 "How to
> remove symbols from an AreaChart in JavaFX"
> https://forums.oracle.com/forums/thread.jspa?messageID=9697930 "Create
> onMouseClickEvent on Symbol of the chart"
> https://forums.oracle.com/forums/thread.jspa?messageID=10145108 "How to
> customize line chart series and symbols?"
> https://forums.oracle.com/forums/thread.jspa?messageID=10013764 "Pie
> Chart and legend symbols"
> https://forums.oracle.com/forums/thread.jspa?messageID=1063034 "Toggle
> the visibility of a single series with symbols"
> https://forums.oracle.com/forums/thread.jspa?messageID=10286441 "Coloring
> the legend"
> https://forums.oracle.com/forums/thread.jspa?messageID=10598795 "Display
> Tooltips on charts values?"
> https://forums.oracle.com/forums/thread.jspa?messageID=10680210 "Creating
> a table within the actual Chart"
>
> http://stackoverflow.com/questions/11949891/javafx2-linechart-symbols-and-css"LineChart symbols and CSS"
>
> http://stackoverflow.com/questions/12287484/controlling-symbols-etc-in-linecharts-inline-programmatically"Controlling symbols, etc. in lineCharts inline programmatically"
>
> http://stackoverflow.com/questions/12622709/javafx-2-0-how-to-change-legend-color-of-a-linechart-dynamically"How to change legend color of a LineChart dynamically?"
>
> http://stackoverflow.com/questions/9757848/how-to-dynamically-change-line-style-in-javafx-2-0-line-chart"How to dynamically change line style in JavaFX 2.0 line chart?"
>
> http://stackoverflow.com/questions/15237192/how-to-display-bar-value-on-top-of-bar-javafx"how to display bar value on top of bar javafx"
>
> People do have difficulties trying to get charts to look and work the way
> they want.
> It's somewhat understandable because there are a million different ways
> you can imagine charts to look and data to be represented, so they tend to
> be pretty heavily customized.
>
> All of the above questions were answerable using the current public API
> (mostly before the code was open sourced).  JavaFX is flexible enough that
> you can get it to do pretty much anything with a fairly minimal API, but
> knowing a few tricks such as lookup by css selector, helps in customizing
> complex hierarchical nodes like charts (in the absence of easily
> discoverable public api).
>
> I guess, the good news from this is that JavaFX charts is a feature that
> gets some usage.
> It's also a nice library and one of the reason people use it is that the
> default charts look nice - fresh and clean.
>
> In terms of stuff that people struggle with, it would probably be (in
> decreasing order of precedence):
>   Concurrency,
>   Tables,
>   Custom charts,
>   Working out why javafx is not on the classpath,
>   Deployment,
>   Dialogs,
>   Layout,
>   Reusing nodes in the scene graph
>
> -----Original Message-----
> From: openjfx-dev-bounces at openjdk.java.net [mailto:
> openjfx-dev-bounces at openjdk.java.net] On Behalf Of Mark Fortner
> Sent: Wednesday, March 13, 2013 11:32 AM
> To: Sven Reimers
> Cc: openjfx-dev at openjdk.java.net
> Subject: Re: [API Review]: RT-28148 - Add createSymbols Property to
> AreaChart / StackedAreaChart
>
> The SymbolFactory idea should probably be discussed a little further.
>
> It would be useful if there was a simple Symbol interface that you could
> use.  This would let you turn any Node subclass into a Symbol.
>
> public interface ISymbol{
>
>    Node getNode();
>    void setStyle(.....)
>    void addEventHandler(....)
>    void removeEventHandler(....)
>
> }
>
> The event handler methods would insure that the symbol can always respond
> to mouseover and click events (or any other events the user wants to
> support).  The style method makes it easy to make the symbol pretty.
>
> The factory would then do something simple like:
>
> public interface ISymbolFactory {
>
>    /** Get's a series specific symbol. */
>    ISymbol getSymbol(Series<X,Y> series, Data<X, Y> dataItem);
>
> }
>
>
> Inside the chart, the default implementation of the SymbolFactory could be
> an anonymous inner class or create an external implementation if you wanted
> it to serve as a template for users to extend and customize.  You could
> pass new implementations of the SymbolFactory into the class in the
> constructor if you wanted to change the look.  You'd want to do this before
> you actually started passing data to the chart, hence the idea of putting
> the factory in a constructor.
>
> Does that sound reasonable?
>
>
> Mark
>
>
>
> On Tue, Mar 12, 2013 at 3:01 AM, Sven Reimers <sven.reimers at gmail.com
> >wrote:
>
> > I like the idea of a symbol factory as well, but it will need to be in
> > some way configured per series, since a data item (XYChart.Data) does
> > not know about its series.
> >
> > Seems this may be a bigger API change though - Should we track this
> > separately?
> >
> > Any further comments?
> >
> > -Sven
> >
> >
> >
> > On Tue, Mar 12, 2013 at 12:33 AM, Jasper Potts <jasper.potts at oracle.com
> >wrote:
> >
> >> A symbol factory would also be a good idea, take in data item and
> >> return Node.
> >>
> >> Jasper
> >>
> >> On Mar 11, 2013, at 4:20 PM, Mark Fortner <phidias51 at gmail.com> wrote:
> >>
> >> > I recently came across the "createSymbols" property code in the
> >> LineChart
> >> > and was wondering if there was some reason to write it this way
> >> > rather
> >> than
> >> > simply having a default implementation of some Symbol interface
> >> > which
> >> the
> >> > user can replace by simply setting the value.
> >> >
> >> > For my application, I ended up writing some conditional decorators
> >> > for
> >> the
> >> > symbol, but as I was doing this I thought how much easier it would
> >> > be if the symbols had a factory where one could register new
> >> > implementations,
> >> or
> >> > replace the factory itself to provide some conditional switching
> >> > logic,
> >> etc.
> >> >
> >> > Any thoughts on improving the flexibility of the charts?
> >> >
> >> > Cheers,
> >> >
> >> > Mark
> >> >
> >> >
> >> >
> >> > On Mon, Mar 11, 2013 at 3:53 PM, Paru Somashekar <
> >> > parvathi.somashekar at oracle.com> wrote:
> >> >
> >> >> Ok thanks Jasper. That makes sense. I updated RT-21539 with the
> >> >> our
> >> plan
> >> >> of not adding the API at the Series level.
> >> >>
> >> >> thanks,
> >> >> Paru.
> >> >>
> >> >> On 3/11/13 3:25 PM, Jasper Potts wrote:
> >> >>
> >> >>> I feel like adding "createSymbols" boolean property to Area,&
> >> >>> StackedArea charts makes sense to match LineChart.
> >> >>>
> >> >>>
> >> >>> I don't like the idea of adding API to the series object on
> >> >>> XYChart as that is more generic and used by many chart types. If
> >> >>> the user needs
> >> fine
> >> >>> grain control of symbols like in RT-21539 they can turn auto
> >> >>> symbol generation off with "createSymbols = false" then create
> >> >>> their own
> >> symbol
> >> >>> nodes for the cases when they do want them.
> >> >>>
> >> >>> Thanks
> >> >>>
> >> >>> Jasper
> >> >>>
> >> >>> On Mar 8, 2013, at 10:08 AM, Paru Somashekar<parvathi.**
> >> >>> somashekar at oracle.com <parvathi.somashekar at oracle.com>>  wrote:
> >> >>>
> >> >>> There is a request for adding the createSymbols flag at the
> >> >>> XYChart's
> >> >>>> Series level instead of on Chart.
> >> >>>> JIRA : http://javafx-jira.kenai.com/**browse/RT-21539<
> >> http://javafx-jira.kenai.com/browse/RT-21539>
> >> >>>>
> >> >>>> I think it might be a good idea to add it at the Series level so
> >> >>>> that one can turn ON / OFF symbols per Series rather than for
> >> >>>> all the
> >> series of
> >> >>>> a chart.
> >> >>>> The API could continue to be the same - except live at the
> >> >>>> Series
> >> level.
> >> >>>> Each chart can then create symbols for each of its Series only
> >> >>>> if
> >> this flag
> >> >>>> is turned on.
> >> >>>> This might however not make much sense for Scatter, Bubble and
> >> BarCharts.
> >> >>>> What do you think Jasper?
> >> >>>>
> >> >>>> -Paru.
> >> >>>>
> >> >>>> On 3/8/13 4:12 AM, Sven Reimers wrote:
> >> >>>>
> >> >>>>> Hi all
> >> >>>>>
> >> >>>>> AreaChart and StackedAreaChart are missing an API to simply
> >> >>>>> disable
> >> the
> >> >>>>> creation of symbols. At the moment this is only possible by
> >> >>>>> complex
> >> css
> >> >>>>> style acrobatics. LineChart on the other hand already provides
> >> >>>>> a
> >> simple
> >> >>>>> way
> >> >>>>> to do this. The proposed tweak takes the existing API from
> >> LineChart and
> >> >>>>> adds this to AreaChart and StackedAreaChart.
> >> >>>>>
> >> >>>>> Desired API change:
> >> >>>>>
> >> >>>>>  /**
> >> >>>>>      * Indicates whether symbols for data points will be
> >> >>>>> created or not.
> >> >>>>>      *
> >> >>>>>      * @return true if symbols for data points will be created
> >> >>>>> and false otherwise.
> >> >>>>>      */
> >> >>>>>     public final boolean getCreateSymbols() { return
> >> >>>>> createSymbols.getValue(); }
> >> >>>>>     public final void setCreateSymbols(boolean value) {
> >> >>>>> createSymbols.setValue(value); }
> >> >>>>>     public final BooleanProperty createSymbolsProperty() {
> >> >>>>> return createSymbols; }
> >> >>>>>
> >> >>>>> Desired additional CSS property (incldues additional
> >> StyleableProperty):
> >> >>>>>
> >> >>>>> -fx-create-symbols
> >> >>>>>
> >> >>>>>
> >> >>>>> JIRA:
> >> >>>>> http://javafx-jira.kenai.com/**browse/RT-28148<
> >> http://javafx-jira.kenai.com/browse/RT-28148>
> >> >>>>>
> >> >>>>> Thank
> >> >>>>>
> >> >>>>> -Sven
> >> >>>>>
> >> >>>>> P.S. An updated patch will hopefully be available there too.
> >> >>>>>
> >> >>>>>
> >> >>
> >>
> >>
> >
> >
> > --
> > Sven Reimers
> >
> > * Senior Expert Software Architect
> > * NetBeans Dream Team Member: http://dreamteam.netbeans.org
> > * Community Leader  NetBeans: http://community.java.net/netbeans
> >                               Desktop Java:
> > http://community.java.net/javadesktop
> > * Duke's Choice Award Winner 2009
> > * Blog: http://nbguru.blogspot.com
> >
> > * XING: https://www.xing.com/profile/Sven_Reimers8
> > * LinkedIn: http://www.linkedin.com/in/svenreimers
> >
> > Join the NetBeans Groups:
> > * XING: http://www.xing.com/group-20148.82db20
> > * NUGM: http://haug-server.dyndns.org/display/NUGM/Home
> > * LinkedIn: http://www.linkedin.com/groups?gid=1860468
> >                    http://www.linkedin.com/groups?gid=107402
> >                    http://www.linkedin.com/groups?gid=1684717
> > * Oracle: https://mix.oracle.com/groups/18497
> >
>


More information about the openjfx-dev mailing list