This is just an example to show how you can create your own component from an existing component (here a TextBox).
For that, I wrote a new UI component which is a search text box like you can have it on Mac OS X. This search text box is just a TextBox enhanced with one method which is called each time you enter or delete a character and a small button to reset the criteria in the search text box.
The only problem is this line
override var style = "padding-right: 25 ";
which is not compatible with common profile, but I don’t know how to do that differently.
You can try this JavaFX custom component in the applet below
SearchTextBox.fx |
/* * StatusField.fx * * Created on 3 oct. 2009, 00:44:26 */ package customcomponent; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.control.TextBox; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Rectangle; import javafx.scene.input.MouseEvent; import javafx.scene.input.KeyEvent; /** * @author Patrick */ public class SearchTextBox extends TextBox { public var onResetSearch:function() : Void; public var onSearch:function(s: String) : Void; override var style = "padding-right: 25 "; override var styleClass = "searchTextBox"; override var onKeyTyped = function(event:KeyEvent){ if (this.rawText!=""){ onSearch(this.rawText); } } public override function create():Node { var t = super.create(); var resetButton:Group; var g = Group { content: [ t, resetButton = Group { var crossWidth = bind this.layoutBounds.height * 0.45; var crossHeight = bind this.layoutBounds.height * 0.05; visible : bind this.rawText.length() > 0 layoutX: bind this.layoutBounds.width - (this.layoutBounds.height / 2.0) layoutY: bind this.layoutBounds.height / 2.0 content: [ Circle { fill: Color.GRAY radius: bind this.layoutBounds.height * 0.325 // 65% of the texbox height and div 2 for the radius } Rectangle { width: bind crossWidth height:bind crossHeight translateX: bind 0 - crossWidth / 2.0 translateY: bind 0 - crossHeight / 2.0 fill : Color.WHITE rotate: 45 } Rectangle { width: bind crossWidth height:bind crossHeight translateX: bind 0 - crossWidth / 2.0 translateY: bind 0 - crossHeight / 2.0 fill : Color.WHITE rotate: -45 } ] onMouseClicked: function (event:MouseEvent ){ commit(); this.text=""; onResetSearch(); } } ] } return g; } }
Main.fx |
/* * Main.fx * * Created on 3 oct. 2009, 00:44:05 */ package customcomponent; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.text.Text; import javafx.scene.text.Font; import javafx.scene.control.Button; /** * @author Patrick */ Stage { title: "Application title" width: 250 height: 200 scene: Scene { content: [ Text { font : Font { size : 16 } x: 10 y: 30 content: "Search " } SearchTextBox { translateX :10 translateY :40 onResetSearch:function(){ println("reset !"); } onSearch:function(s: String){ println("Search of : {s}"); } } Button { text: "just a button to change focus" translateX :10 translateY :80 action: function() { println("Hello !") } } ] } }
Aucun commentaire:
Enregistrer un commentaire