Lazy loading of images in scrollpane

Tom Schindl tom.schindl at bestsolution.at
Mon Jul 13 18:35:37 UTC 2015


Use a ListView ;-) Unfortunately the base class (VirtualFlow is not
public API)

Tom

On 13.07.15 20:19, Christian Krampenschiesser wrote:
> Hi all,
> 
> I am trying around since some time to load images when they are visible in
> a scollpane.
> However the only solution I got so far is quite complicated and done via
> checking the bounds in the scene.
> However sometimes the calculated bounds of the item in the scene are way
> out of the scene.
> I am really looking for a simpler solution then my current one.
> My tests are fine so far with small amounts of thumbnails. however with big
> scenes (~3000 thumbnails) everything goes wrong :(
> But if there is none maybe someone can point out my wrong bounding box
> calculations and why they are wrong. It seems I didn't understand
> everything correctly:
> 
> protected SimpleObjectProperty<GalleryItem> item = new
> SimpleObjectProperty<>();//contains, path and loads thumbnail + real
> image
> 
> ....
> 
> button.localToSceneTransformProperty().addListener(new
> ChangeListener<Transform>() {//button has an imageview which displays
> the thumbnail
>   @Override
>   public void changed(ObservableValue<? extends Transform> observable,
> Transform oldValue, Transform newValue) {
>     Point2D point = button.localToScene(button.getLayoutX(),
> button.getLayoutY());
>     Scene scene = button.getScene();
> 
>     boolean isLayoutedCorrectly = button.getWidth() > 100 &&
> button.getHeight() > 100;//hack to execute after layouting, otherwise
> all items are visible
> 
>     if (scene != null && button.getParent() != null &&
> isLayoutedCorrectly && armed) {//armed is set 100ms after adding all
> buttons to a flowpane in a scrollpane
>       BoundingBox sceneBox = new BoundingBox(scene.getX(),
> scene.getY(), scene.getWidth(), scene.getHeight());
>       BoundingBox buttonBox = new BoundingBox(point.getX(),
> point.getY(), button.getWidth(), button.getHeight());
> 
>       if (sceneBox.intersects(buttonBox)) {//visible
>         if (imageView.getImage() == null) {
>           log.debug("Showing {}", button.getText());
>           Image image = item.get().loadThumbNail();
>           if (image != null) {
>             imageView.setImage(image);
>             imageView.setFitHeight(image.getHeight());
>             imageView.setFitWidth(image.getWidth());
>           }
>         }
>       }
>     }
>   }
> });
> 
> 
> Thanks!
> 
> Christian
> 


-- 
Thomas Schindl, CTO
BestSolution.at EDV Systemhaus GmbH
Eduard-Bodem-Gasse 5-7, A-6020 Innsbruck
http://www.bestsolution.at/
Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck


More information about the openjfx-dev mailing list