[REVIEW REQUEST] Support for customising the TableColumn header area

Jonathan Giles jonathan.giles at oracle.com
Mon Mar 12 17:51:03 PDT 2012


Hi all,

An area that I'm planning to improve in JavaFX 2.2 is to do with 
providing API around interacting with the header area of the TableView 
control. This is also known as RT-14909 [1].

The main use cases here (that have been expressed to me - if you have 
others let me know!) are the following:

1) Putting a graphic in the header area, with no text beside it. This 
would allow for the common UI pattern you see in mail programs and other 
applications where there are narrow columns. For example, Thunderbird 
has a 'junk status' column that shows a flame in the header area, and no 
text. This is because the visuals in this content area for this column 
are just a circle for toggling true or false, and any text in the column 
header would either make the column too wide, or result in the text 
being truncated.

2) Inserting buttons that provide additional functionality. For example, 
a MenuButton may be placed in the header to allow for the user to choose 
from a set of filter rules, etc.

3) Easily attaching a context menu for column-specific actions.

I think providing API to deal with these use cases is quite important, 
and have a first draft patch attached to RT-14909 for your reading 
pleasure. I've created two patches, one which only shows the public API 
changes, and the other that shows all changes. As I note later in the 
Jira thread, I'm not overly happy with certain parts of the proposed 
API, but I wanted to make what I do have public so that any feedback or 
use cases can come in early. In other words, this is more of a straw man 
proposal, and I really welcome your feedback.

An example use of this new API to place an image in the header is the 
following code:

    invitedCol.getHeader().setGraphic(graphic);

Of course, as with all references to 'graphic' in the Controls API, this 
can be any Node, and it will be fully interactive (that is, it won't be 
'drawn' into the header, it'll be a true part of the scenegraph). This 
means you can use the same API above to put a Button or any other control:

    countryCol.getHeader().setGraphic(new Button("Interactive Button"));

For the context menu use case, this can be achieved as following:

    ContextMenu menu = new ContextMenu(new MenuItem("Reset column
    content"));
    countryCol.getHeader().setContextMenu(menu);

Finally, you can also overwrite the sort node. For example, the 
following code crudely replaces the normal TableView sort arrow with a 
green or red 10x10 pixel rectangle, based on the sort order. If no 
sortNode is set, the default one is used instead.

    Rectangle rect = new Rectangle(10, 10);
    rect.fillProperty().bind(new ObjectBinding<Paint>() {
         { bind(countryCol.sortTypeProperty()); }

         @Override protected Paint computeValue() {
             return countryCol.getSortType() ==
    TableColumn.SortType.ASCENDING ? Color.RED : Color.GREEN;
         }
    });
    countryCol.getHeader().setSortNode(rect);

Once again, thanks for your consideration, and I look forward to your 
feedback!

[1] http://javafx-jira.kenai.com/browse/RT-14909

Thanks!
Jonathan


More information about the openjfx-dev mailing list