JDK6 has done lot of changes in LiveConnect. LiveConnect is a feature
in the browser for communication between Java Applet and JavaScript.
With the new Plugin2, most of the work has been left on browser to do.
Initially it was Java which do a good amount of work. So, now the Java
Plug-in will operate like any other scriptable Plug-in. ..............
So, if you are a Swing Developer, you have heard many stories where
someone messed Lightweight component with Heavyweight component. In one
line " A heavyweight component
is one that is associated with its own native screen resource (commonly
known as a peer). A lightweight component is one that "borrows" the
screen resource of an ancestor (which means it has no native resource
of its own -- so it's "lighter")."
Now many times you have heard "Don't mix lightweight and heavyweight". What will happen ? Alright, here is a small code : ............
If you are looking for sorting algorithms and if you use some sorting
algorithm in your code/application/big application, then have a look
here. First of all sorting/searching is a classic thing. It take more
than 70 percent of your application time.People/Developer/Mathematician
do a lot of work on optimizing this work to get Best, best out of best.
Early days, JDK used to use QuickSort which is one of the best sorting
algorithm and go for a complexity of O(nlogn). But mind it, QuickSort
is a recursive algorithm and consume space. Whereas some of the
algorithm which has the complexity like O(n^2) go for less complex in
terms of memory. These days our platform varies from small mobile
device to a terabyte storage machine............
Time for adoption :). We are starting up Bangalore Open JavaFX User
Group and searching for the JavaFX techie who can lead it. So, all
JavaFX developers in Bangalore please write a mail to me, if you are
interested. My mail ID is : vaibhav.choudhary-AT-sun-DOT-com or can drop a
comment here.
A very simple example in JavaFX to show that shape intersection/subtraction works so cool in JavaFX. Gradient comes out in a nice fashion and motion is also smooth.
Its again a open code written. Personally I don't like too much of OOP's coding in JavaFX as it is not a language meant for it. But yes if sample size/application size is big, its always good to make things seperate.
Sorry this blog is nothing related with Java or JavaFX !
Some day back, I have given one small presentation on Cloud Computing in PESIT, Bangalore. Quite enthu students and ready to face the challenges of world.
Some simple debugging tools related to Java. These are for those who are new to Java.
1.
Application is crashing : Most miserable one. Get your log file, try to
analysis log. How to write log file, use Java Logger API. Java Logger
had been introduced in JDK 1.4.2. The most awesome feature of Logger
API is that you can use it in production without much overhead. The
overhead is controlled by something called level in API. Level goes
from FINEST to SEVERE. You can refer to O'Relly Book "Java, In a NutShell". I guess. ...........
It's very very important for us to know the correct method of shipping the application. Out of Browser feature is awesome but you can't simply expect Customer, End User to drag the applet out of browser by pressing Alt-Space. No, its just a way Java Runtime provide to us. In JavaFX, this feature is customizable up to an awesome extent. You can simply write 4-5 lines of code and make the applet draggable as you feel it should :D.
Maybe, I mentioned something like this in my prev. post, so can be repeated, but not truly ! Have Fun !
Now again, we will talk about Customer, User look and feel. I bet most of us got bored watching rotating Java Logo and applet is taking time to load. JavaFX new feature is to use splash screen for that. Though here in this article you will get one static splash screen but no one can stop you making a dynamic gif splash screen. We will have that also in show case soon, till that time enjoy with this :
Probably I missed something. But this is the way we can add
indefinite progress indicator with any unpredictable events. Here I am
just calling a Web service to show yahoo maps for NY city.
Here how progress indicator looks like : ..........
A simple example how ListView works in JavaFX 1.2. I guess it need more
feature in next release. But it do basic stuff like providing scrollbar
if list is long, selected item actions.Something like this :
Here is the simple code, in which I am adding text ..........
It has been
used in lot of samples but if you are finding it tough to grab out the
code from sample to use. Here is a simple(simplest actually :) ) code
to use scrollBar. I have create array of rectangle and associated
scroll bar with it. Something like this ..........
It's a long time being blogging. Actually not done anything new from
long time :). Here is one simple concept which some guys asked me. We
have provided hyperlink API in JavaFX 1.2 but some of us struggled to open a URL using hyperlink API.
Hmm, 2 ways to do it actually.
No1 : Use the Desktop API of JDK6. It's simple to use. One example is here....
As already discussed, JavaFX 1.2 provide API set for Charts and Graphs. Though I decided to put my hand dirty in writing one 3D piechart from my own. With mine, you will get additional feature of explode in and out feature :). Well, action can be written with the existing chart API and I guess explode feature will also come soon.
Making 3D Pie chart is nothing but layering of 2D Pie Chart and here goes a small code :
Slice.fx
package piechart3d;
import java.lang.Math;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.input.MouseEvent;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
/**
* @author Vaibhav Choudhary
*/
public class Slice extends CustomNode {
public var color: Color;
public var sAngle: Number = 0.0;
public var len: Number = 0.0;
public var xt = 0.0;
public var yt = 0.0;
function explodout():Boolean {
var t = Timeline {
repeatCount: 1
keyFrames: [
KeyFrame {
time: 0.25s
canSkip: true
values: [
xt =>
30 * Math.cos(2 * Math.PI * (sAngle + len / 2) / 360) tween Interpolator.EASEBOTH,
yt =>
-30 * Math.sin(2 * Math.PI * (sAngle + len / 2) / 360) tween Interpolator.EASEBOTH
]
}
]
}
t.play();
return true
}
function explodein():Boolean {
var t1 = Timeline {
repeatCount: 1
keyFrames: [
KeyFrame {
time: 0.25s
canSkip: true
values: [
xt => 0,
yt => 0
]
}
]
}
t1.play();
return true
}
public override function create(): Node {
return Group {
blocksMouse: true
translateX: bind xt
translateY: bind yt
onMouseClicked: function( e: MouseEvent ):Void {
if(xt == 0 and yt == 0) {
explodout();
}
else
explodein();
}
content: for(num in [0..25]) {[
Arc {
stroke: color
cache: true
fill: color
translateX: 0
translateY: (num + 1) * 1
centerX: 250
centerY: 250
radiusX: 150
radiusY: 60
startAngle: bind sAngle
length: bind len
type: ArcType.ROUND
}
Arc {
cache: true
fill: LinearGradient {
startX: 0.3
startY: 0.3
endX: 1.0
endY: 1.0
stops: [
Stop {
color: color
offset: 0.0
},
Stop {
color: Color.WHITE
offset: 1.0
},
]
}
centerX: 250
centerY: 250
radiusX: 150
radiusY: 60
startAngle: bind sAngle
length: bind len
type: ArcType.ROUND
},
]
}
};
}
}
Anything here can be made generic to any extend. There is a for loop of 0..25 in Slice.fx which speaks about the thickness of chart :) and some mathematics in timeline speaks about explode feature.
Now if you compare this with PieChart that comes in API, you will see this has some jerky corners + Color combination is not as soluble. How that has been made is secret :).
Final destination for us is death and final destination of a JavaFX application is Browser. So, we should know what all things we can do with an application, JavaFX application, in browser.
Here are some :
1. Understand when our code will run on browser and when on Desktop/Mobile and optimize the code. Here is a small one :
package appletshow;
import javafx.scene.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.text.*;
import javafx.stage.*;
/**
* @author Vaibhav Choudhary
*/
var textContent = "Hello JavaFX in applet World";
var subtext = "Drag me out for this example(Alt->Drag)";
var vis = false;
var s: Stage = Stage {
title: "Applet Show"
width : 600 height : 200
style: StageStyle.TRANSPARENT
scene : Scene {
fill: Color.BLACK
content: [
Text { content: textContent
x: 25 y:35 fill: Color.WHITE
font: Font{size: 24}
}
Text { content: subtext
x: 25 y:55 fill: Color.WHITE
font: Font{size: 14}
}
Rectangle { x: 560 y: 10 width: 20 height: 20
arcHeight:5
arcWidth: 5
stroke:Color.GRAY
strokeWidth: 2
fill: Color.TRANSPARENT
visible: bind ("{__PROFILE__}" != "browser")
onMouseClicked: function(e: MouseEvent): Void {
s.close();
}
}
Text {
fill: Color.WHITE
visible: bind ("{__PROFILE__}" != "browser")
font : Font {
name:"Arial Bold"
size: 14
}
x: 567, y: 25
content: "x"
}
,
]
}
}
Close button will be visible only in browser not in desktop/mobile. So, this is logical, close button should not be in Browser.
2. Remeber, we have draggable feature and things can change from applet inside the browser and when it has been dragged out :).
Now, I want again that when I dragged my applet out of the browser, I get a close button which is logical again, because a dragged application is like a desktop application. So, here we go :)
package appletshow2;
import javafx.scene.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.text.*;
import javafx.stage.*;
var textContent = "Hello JavaFX in applet World";
var subtext = "Drag me out for this example(Alt->Drag)";
var vis = false;
var s: Stage = Stage {
title: "Applet Show"
width : 600 height : 200
style: StageStyle.TRANSPARENT
scene : Scene {
fill: Color.BLACK
content: [
Text { content: textContent
x: 25 y:35 fill: Color.WHITE
font: Font{size: 24}
}
Text { content: subtext
x: 25 y:55 fill: Color.WHITE
font: Font{size: 14}
}
Rectangle { x: 560 y: 10 width: 20 height: 20
arcHeight:5
arcWidth: 5
stroke:Color.GRAY
strokeWidth: 2
fill: Color.TRANSPARENT
visible: bind vis
onMouseClicked: function(e: MouseEvent): Void {
s.close();
}
}
Text {
fill: Color.WHITE
visible: bind vis
font : Font {
name:"Arial Bold"
size: 14
}
x: 567, y: 25
content: "x"
}
,
]
}
extensions: [
AppletStageExtension {
onDragStarted: function() {
vis = true;
}
onAppletRestored: function() {
vis = false;
}
useDefaultClose: false
}
]
}
Points to remember : a. useDefaultClose : false, it will vanish the default close button else it will be a mess, seeing too many close buttons. b. AppletStageExtension has lot of other features, please check the API. c. Close button should vanish once it goes back into the browser.
3. Ah, now most important about dragging feature. I don't want to drag applet with Alt-> Drag feature, I want it should be draggable in simple style like we do with other application, NO COMPLICATION. Use this :)
Hi, I am Vaibhav. I am working in Java and JavaFX group. This blog is about writing simple code and application in Java and newly launched JavaFX. I am working in Bangalore, India.
It was a very nice idea! Just wanna say thank...
I think I will try to recommend this post to my fr...
It’s amazing how far you have come with your...
<p>Your article is so good that I can’...
thank you very much
[url=
Support you, and I will always take attentio...