JIRA : https://javafx-jira.kenai.com/browse/RT-24105 &
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.

Reply via email to