scroll - How can I set another value in property listener? -
i want speed-up scrollpane scrolling. need like:
scrollpane.vvalueproperty().addlistener((observable, oldvalue, newvalue) -> { scrollpane.setvvalue(oldvalue.doublevalue() + (newvalue.doublevalue() - oldvalue.doublevalue()) * 2); });
but without stackowerflow exections , working..
may there way consume event?
p.s. btw, why setonscroll() fire when scrolling reaches max (top) or min (bot) position?
i don't recommend modifying property while changing, if want need set flag suppress recursive calls. here's example:
import java.util.random; import javafx.application.application; import javafx.beans.property.property; import javafx.beans.value.changelistener; import javafx.beans.value.observablevalue; import javafx.scene.node; import javafx.scene.scene; import javafx.scene.control.scrollpane; import javafx.scene.layout.region; import javafx.scene.layout.tilepane; import javafx.stage.stage; public class modifyscrollspeed extends application { @override public void start(stage primarystage) { scrollpane scrollpane = new scrollpane(createcontent()); doublinglistener.register(scrollpane.vvalueproperty()); scene scene = new scene(scrollpane, 400, 400); primarystage.setscene(scene); primarystage.show(); } private static class doublinglistener implements changelistener<number> { private boolean doubling ; private property<number> target ; private doublinglistener(property<number> target) { this.target = target ; } public static void register(property<number> target) { target.addlistener(new doublinglistener(target)); } @override public void changed(observablevalue<? extends number> observable, number oldvalue, number newvalue) { if (! doubling) { doubling = true ; target.setvalue(oldvalue.doublevalue() + 2 * (newvalue.doublevalue() - oldvalue.doublevalue())); } doubling = false ; } } private node createcontent() { tilepane tilepane = new tilepane(); random rng = new random(); (int = 0; < 200; i++) { region region = new region(); region.setminsize(40, 40); region.setprefsize(40, 40); region.setmaxsize(40, 40); region.setstyle(string.format("-fx-background-color: #%02x%02x%02x;", rng.nextint(256), rng.nextint(256), rng.nextint(256))); tilepane.getchildren().add(region); } return tilepane ; } public static void main(string[] args) { launch(args); } }
i don't see other way change increment amounts scroll pane. note scrollbar
has api changing increment amounts via unitincrement
, blockincrement
properties, scrollpane
not have equivalent properties.
there comment in source code scrollpane
says
/* * todo unit increment , block increment variables have been * removed public api. these intended mapped * corresponding variables of scrollbars. however, problem * specified in terms of logical corrdinate space * of scrollpane (that is, [hmin..hmax] [vmin..vmax]. * incorrect. scrolling user action , should based * on how of content visible, not on abstract * coordinate space. @ later date may add finer-grained * api allow applications control this. meanwhile, skin should * set unit , block increments scroll bars * reasonable based on viewport size, e.g. block increment * should scroll 90% of pixel size of viewport, , unit * increment should scroll 10% of pixel size of viewport. */
the current skin scroll pane hard codes unit , block increments scroll bars (in updatehorizontalsb
, updateverticalsb
methods) in manner described in comment (i.e. 10% , 90% of visible amount), see no real way @ these. in java 9 skin class become public class, , @ minimum subclass , modify behavior.
Comments
Post a Comment