java - How to specialize a components of JavaFX and hide its API to only show mine -
as said in title want specialize usage of tableview reuse many time, speciazation contains :
- columns shown
- filtering of added according default duplicate filter , addiotional (either based on boolean values or callbacks).
i use raw fxml files , controller, no ui drag , drop building.
in order keep usage of component easiest possible hide component part of javafx , allow methods, how ?
create class extending control. add methods want user access class.
create skin class , implement behavior don't want user access there.
benefits:
- hides implementation details user.
- allows user replace "private" behavior, if neccessary.
- allows access "public" behavior form node directly.
example
control
public class mycontrol extends control { @override protected skin<?> createdefaultskin() { return new mycontrolskin(this); } private final stringproperty text = new simplestringproperty(); public final string gettext() { return this.text.get(); } public final void settext(string value) { this.text.set(value); } public final stringproperty textproperty() { return this.text; } } skin
public class mycontrolskin extends skinbase<mycontrol> { public mycontrolskin(mycontrol control) { super(control); text text = new text(); text.textproperty().bind(control.textproperty()); getchildren().setall(text); } } use
@override public void start(stage primarystage) { final mycontrol control = new mycontrol(); button btn = new button("say 'hello world'"); btn.setonaction((actionevent event) -> { control.settext("hello world!"); }); scene scene = new scene(new vbox(10, btn, control)); primarystage.setscene(scene); primarystage.show(); } note not matter how create ui. directly created java or loaded fxml - not matter. e.g. use skin fxml controller , root:
<fx:root type="javafx.scene.control.skinbase" xmlns:fx="http://javafx.com/fxml"> <children> <text fx:id="text"/> </children> </fx:root> @fxml private text text; public mycontrolskin(mycontrol control) throws ioexception { super(control); getchildren().clear(); fxmlloader loader = new fxmlloader(someurl); loader.setroot(this); loader.setcontroller(this); loader.load(); text.textproperty().bind(control.textproperty()); } btw: duplicate filtering imho better of in seperate class, transformationlist. way reuse behavior independent of ui allow easier reuse (e.g. use listview).
Comments
Post a Comment