ListCellSkin: cleanup to not use (misbehaving) listeners ..

Jeanette Winzenburg fastegal at swingempire.de
Tue Jun 9 13:41:23 UTC 2020


After a couple of days spent to understand why/how ListCellSkin  
listening to the listView's fixedCellSize is misbehaving (there are  
multiple stumbling stones in its listener registration, details in the  
bug report https://bugs.openjdk.java.net/browse/JDK-8246745) - I'm  
about to remove that listener completely.

All it does is to copy the value of the listView's fixedCellSize to  
the skin, without any action triggered. Later on, that copied value is  
used in the computeXXHeight methods.

Code snippets:

     // fields
     private double fixedCellSize;
     private boolean fixedCellSizeEnabled;

     // listener:
     registerChangeListener(listView.fixedCellSizeProperty(), e -> {
         this.fixedCellSize = getSkinnable().getListView().getFixedCellSize();
         this.fixedCellSizeEnabled = fixedCellSize > 0;
     });

     // usage
     @Override
     protected double computePrefHeight(...) {
         if (fixedCellSizeEnabled) {
             return fixedCellSize;
         }
         // do the per-row calc ...
     }

Instead of keeping the fields in-sync with those of the listView, we  
could just query the current state:

     @Override
     protected double computePrefHeight(...) {
         double fixedCellSize = getFixedCellSize();
         if (fixedCellSize > 0) {
             return fixedCellSize;
         }
         // do the per-row calc ...
     }

     double getFixedCellSize() {
         ListView<?> listView = getSkinnable().getListView();
         return listView != null ? listView.getFixedCellSize() :  
Region.USE_COMPUTED_SIZE;
     }

Doing so would by-pass the pitfalls of corrently re-wiring the  
listener to the path property (it's added complexity without benefit).  
Plus cleanup unneeded aliasing (which I think is a code smell anyway)

Opinions, please

-- Jeanette




More information about the openjfx-dev mailing list