JavaFX Custom Control – Nest Thermostat Part 3

Hi, after some discussions with my colleagues, I decided today to show that the css approach is not the only one that can be used to create a custom control. Of course it allows to offer some look and feel extension point, but the same approach (working with svand transfering to JavaFX) can be used using code API.

Here is the graphic initialization method where I have replaced the css initialization code (now commented out) by call to the JavaFX objects API.
 
 
 
 

private void initGraphcis() {
	// frame = new Region();
	// frame.getStyleClass().setAll("frame");
	frame = new Circle();
	frame.setFill(FRAME_FILL);

	shadow = new DropShadow();
	shadow.setBlurType(BlurType.ONE_PASS_BOX);
	shadow.setColor(Color.rgb(0, 0, 0, 0.4));
	frame.setEffect(shadow);

	frame1 = new Circle();
	// frame1.getStyleClass().setAll("frame1");
	frame1.setFill(FRAME1_FILL);
	frame1.setStroke(FRAME1_STROKE);
	frame1.setStrokeWidth(2.0);

	frame2 = new Circle();
	// frame2.getStyleClass().setAll("frame2");
	frame2.setFill(FRAME2_FILL);
	frame2.setStroke(FRAME2_STROKE);

	frame3 = new Circle();
	// frame3.getStyleClass().setAll("frame3");
	frame3.setFill(Color.web("#c44f1a"));

	line = new SVGPath();
	// line.getStyleClass().setAll("line");
	line.setContent("M 0.75,1.806272 C 0.75,1.806272 67.422114,-2.659598 118.06708,1.085452 130.59357,2.011752 166.81696,11.039202 185.35089,11.189052 206.02921,11.356252 242.24677,2.052122 255.84883,1.085452 304.58057,-2.377808 372.89963,1.806272 372.89963,1.806272");
	line.setFill(Color.web("#ffffff00"));
	line.setStroke(Color.web("#4d4d4d"));
	line.setStrokeWidth(1.5);

	line1 = new SVGPath();
	// line.getStyleClass().setAll("line1");
	line1.setContent("M 0.75,1.806272 C 0.75,1.806272 67.422114,-2.659598 118.06708,1.085452 130.59357,2.011752 166.81696,11.039202 185.35089,11.189052 206.02921,11.356252 242.24677,2.052122 255.84883,1.085452 304.58057,-2.377808 372.89963,1.806272 372.89963,1.806272");
	line.setFill(Color.web("#ffffff00"));
	line.setStroke(Color.web("#141414"));
	line.setStrokeWidth(1.5);

	lightEffect = new Ellipse();
	lightEffect.setFill(Color.rgb(255, 255, 255, 0.7));
	lightEffect.setEffect(new BoxBlur(90, 90, 5));
	lightEffect.setCache(true);

	getChildren().setAll(frame, frame1, frame2, frame3, line, line1, lightEffect );
    }

And the management of the nodes size is as follow (tha same is to be done for the css approach anyway).

private void resize() {
	size = getWidth() < getHeight() ? getWidth() : getHeight();
	// frame.setPrefSize(size, size);
	frame.setRadius(size / 2.0);
	frame.setTranslateX(size / 2.0);
	frame.setTranslateY(size / 2.0);

	frame1.setRadius(frame1Ratio * size / 2.0);
	frame1.setTranslateX(size / 2.0);
	frame1.setTranslateY(size / 2.0);
	shadow.setOffsetX(size * shadowXOffset);
	shadow.setOffsetY(size * shadowYOffset);
	shadow.setRadius(size * shadowSizeOffset);
	shadow.setSpread(0.099);

	frame2.setRadius(frame2Ratio * size / 2.0);
	frame2.setTranslateX(size / 2.0);
	frame2.setTranslateY(size / 2.0);

	frame3.setRadius(frame3Ratio * size / 2.0);
	frame3.setTranslateX(size / 2.0);
	frame3.setTranslateY(size / 2.0);

	final double scaleRatio = size / initialSize;
	line1.setScaleX(scaleRatio);
	line1.setScaleY(scaleRatio);
	final double lineWidth = line1.getBoundsInLocal().getWidth();
	line1.setTranslateX(size / 2.0 - lineWidth / 2.0);
	line1.setTranslateY(size * 408.72054 / initialSize);

	line.setScaleX(scaleRatio);
	line.setScaleY(scaleRatio);
	line.setTranslateX(size / 2.0 - lineWidth / 2.0);
	line.setTranslateY(size * 410.08419 / initialSize);

	lightEffect.setRotate(lightEffectRotate);
	lightEffect.setTranslateX(lightEffectXRatio * size);
	lightEffect.setTranslateY(lightEffectYRatio * size);
	lightEffect.setRadiusX(lightEffectXRadiusRatio * size);
	lightEffect.setRadiusY(lightEffectYRadiusRatio * size);
    }

Next step will be to mix the two approach to offer both working methods for users. Ones will be able to use the css approach to customize the Nest representation, others will be able to use the good code API approach. It will allow me to see what are the impacts on the code (is it heavy or not to mix both approach) and if I shall make a choice between css and code API before going further to keep my code as simple as possible.
 

Reference: JavaFX Custom Control – Nest Thermostat Part 3 from our JCG partner Laurent Nicolas at the Mr LoNee blog.
Related Whitepaper:

Java Essential Training

Author David Gassner explores Java SE (Standard Edition), the language used to build mobile apps for Android devices, enterprise server applications, and more!

The course demonstrates how to install both Java and the Eclipse IDE and dives into the particulars of programming. The course also explains the fundamentals of Java, from creating simple variables, assigning values, and declaring methods to working with strings, arrays, and subclasses; reading and writing to text files; and implementing object oriented programming concepts. Exercise files are included with the course.

Get it Now!  

Leave a Reply


seven + 8 =



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close