API REVIEW for TabPane tab content loading and fixed content size
Daniel Zwolenski
zonski at gmail.com
Wed Jul 3 15:23:30 PDT 2013
I'd probably be a little cautious about the term 'loading' then. In
particular, I'd probably read 'LAZY_LOADING' to hint that the actual tabs
themselves would be loaded/created lazily (a common use case). Might be
just me though.
It looks like the 'lazy' option actually does them eagerly (i.e. all on
startup - not so lazy :) ), just asynchronously. I wonder if there is a
need for one that does them truly 'lazily' (i.e. on selection) much like
the SELECTED_TAB but once first loaded it then keeps it there instead of
adding and removing each selection.
Maybe not the best names below but some ideas:
enum TabContentSceneGraphPolicy {
// The content all the tabs are *added* to the scenegraph up front
with no optimization. If there are a lot of tabs and content is large -
this could potentially cause slow start up time. This is the default
behavior.
ALL_TABS,
//Only the content of the selected tab will be *added* to the
scenegraph at startup and content of other tabs get *added* *asynchronously* in
the background. Hence there is no *adding* and *removing* of tab content
when different tabs are selected as in the case of the SELECTED_TAB options.
ALL_TABS_ASYNCH,
//Only the content of the selected tab will be *added to the **
scenegraph* on startup and other tabs get *added* on selection. When a new
tab is selected, its content is *added* into the scenegraph and the content
of the previously selected tab is *removed* from the scenegraph.
SELECTED_TAB_AND_REMOVE,
//Only the content of the selected tab will be *added to the **
scenegraph* on startup and other tabs get *added* on selection. Once added,
a Tab is kept in the scenegraph. When a new tab is selected for the first
time, its content is *added* into the scenegraph, after that the tab is
re-shown when selected again.
SELECTED_TAB_AND_KEEP
}
On Thu, Jul 4, 2013 at 8:06 AM, Paru Somashekar <
parvathi.somashekar at oracle.com> wrote:
> **
> Hi Daniel,
>
> Yes, loading is referring to when the tab content gets added to the scene.
> The API to add tabs to TabPane remain the same - the new API is only
> proposing a policy that controls how they get added & removed from the
> scenegraph.
>
> thanks,
> Paru.
>
>
> On 7/3/13 2:35 PM, Daniel Zwolenski wrote:
>
> Hi Paru,
>
> What do you mean by 'loaded'?
>
> Currently we create the tabs and then manually add them doing something
> like:
>
> TabPane tabPane = new TabPane();
> tabPane.getTabs().add(new Tab("Tab1"));
>
> Wouldn't all the 'loading' have already happened before TabPane gets a
> look in? Or are you talking about when the tabs get added to the scene?
>
> Cheers,
> Dan
>
>
>
>
> On Thu, Jul 4, 2013 at 7:03 AM, Paru Somashekar <
> parvathi.somashekar at oracle.com> wrote:
>
>
> JIRA : https://javafx-jira.kenai.com/ browse/RT-24105<https://javafx-jira.kenai.com/browse/RT-24105>&
> https://javafx-jira.kenai.com/ browse/RT-30648<https://javafx-jira.kenai.com/browse/RT-30648>
>
> The following is API to control how tab content gets loaded for a TabPane
> in order to improve startup time and runtime performance for a TabPane.
>
> Jonathan has already reviewed the following API and I have incorporated
> his feedback. Thanks Jonathan.
>
> TabContentSceneGraphPolicy is a static enum within TabPane
> ------------------------------ ------------------------------
> public static enum TabContentSceneGraphPolicy {
> //The content all the tabs get loaded up front with no
> optimization. If there are a lot of tabs and content is large - this could
> potentially cause slow start up time. This is the default behavior.
> ALL_TABS,
> //Only the content of the selected tab will be loaded on startup
> and other tabs get loaded on selection. When a new tab is selected, its
> content is loaded into the scenegraph and the content of the previously
> selected tab is unloaded from the scenegraph.
> SELECTED_TAB,
> //Only the content of the selected tab will be loaded at startup
> and content of other tabs get loaded lazily in the background. Hence there
> is no loading and unloading of tab content when different tabs are selected
> as in the case of SELECTED_TAB option.
> SELECTED_TAB_WITH_LAZY_LOADING
> }
> ------------------------------ ------------------------------ --
> API to specify fixed Width/Height/Size for tab content.
>
> private DoubleProperty fixedWidth
> public final void setFixedWidth(double value)
> public final double getFixedWidth()
> public final DoubleProperty fixedWidthProperty()
>
> private DoubleProperty fixedHeight
> public final void setFixedHeight(double value)
> public final double getFixedHeight()
> public final DoubleProperty fixedHeightProperty()
>
> public final void setFixedSize(double width, double height)
> ------------------------------ ------------------------------ ----
> Notes on performance considerations
>
> The TabPane offers some performance optimizations in the area of tab
> content loading. Basically the default policy is to load the contents of
> all specified tabs. If the TabPane consists of a large number of big
> content tabs, then this could lead to a potential slow start up time, as it
> will have to spend some time in loading all the content up front before
> starting up.
>
> In such situations, the TabPane allows specification of the
> TabContentSceneGraphPolicy which determines how the tab contents are loaded
> : all tabs, selected tab only, or selected tab and lazy loading of the rest
> of the tabs. The selected tab only option also ensures the content of the
> previously selected tab is removed from the scenegraph. This gives the
> added benefit of ensuring that no scenegraph related activities are
> performed on any of the tab contents that is not currently selected.
> However this could potentially cause the tab switch operation to be a bit
> slow. In order to achieve faster tab switch operation, the third option is
> provided where the content of the rest of the tabs are loaded lazily in the
> background. However the lazy loading option could result in a slower
> runtime performance.
>
> Another area of optimization is provided for specifying a fixed width /
> height / size of the tab content area. If a fixed value is specified,
> measurement of the tab content sizes for the purpose of setting the
> available space is eliminated, thus providing faster resize operations on
> windows that contain a TabPane in them.
> ------------------------------ ------------------------------ ---
>
> There might be a situation where the TabContentSceneGraphPolicy is set to
> SELECTED_TAB in which case only the content of the selected tab is loaded
> and user does not set fixed size. In such a case, we can either do one of
> the following,
> 1) hardcode a fixed size if it is not already set
> 2) measure the selected tab only and grow in size only if the size of the
> next selected tab is bigger than the previous one.
> 3) throw an exception if SELECTED_TAB is chosen and fixed size is not set.
> I prefer option either 1 or 2, that way we do not force the developer to
> set a fixed size for the tab content.
> Thoughts suggestions welcome, I shall go with option 1 if I don't hear any.
>
>
>
>
More information about the openjfx-dev
mailing list