The "proper" way to do it is probably to subclass JTable and override the method that implements the UI for the table header.
I don't see anything at all improper about taking the
JTableHeader and making use of it for specialized purposes.
JTable goes to the trouble of giving us a
getTableHeader method, and we have all the listeners we need to draw extra widgets around the
JTableHeader that move as the columns move. The whole system seems designed to make this sort of thing possible.
On the other hand, subclassing is dangerous and error prone. I don't claim to have any special knowledge about what is proper, but using subclassing is asking for trouble.