JavaFX	
  2!	
  Make	
  Java	
  Sexy	
  Again!
張益裕
甲骨文授權教育訓練中心	
  聯成電腦	
  講師
JCheckBox

JWindow

JButton

Swing
JPanel

MouseListener
JTable

JList

JEditorPane

JToggleButton

JPopupMenu

ItemListener

Java3D

JColorChooser

GroutLayout
JComboBox

JRadioButton

JToolBar
JOptionPane

JLabel

JRootPane

FlowLayout

JFrame

WindowListener
JMenuItem

JSplitPane

Java2D

CardLayout

TextListener

ComponentListener

JTextField
JTextPane

JMenu

JScrollBar

ActionListener

JProgressBar

JPasswordField

BorderLayout

JTabbedPane

AWTJDialog

AdjustmentListener

KeyListener

ScrollPaneLayout

JScrollPane

JTree

JTextArea

FocusListener

GridLayout

JToolbar
Beautiful

Fast

Smooth

Simple
Beautiful

Fast

Smooth

Simple
Java EE

JavaFX

Java SE

Java ME

Java Card

JVM

Java ME VM

Card VM

Java Programming Language
• Java language features
• FXML for defining user interfaces
• New graphics pipeline for modern GPUs
• Rich set of UI controls
• Powerful Properties Model
• Swing and AWT Interoperability
JavaFX Public APIs and Scene Graph

Quantum Toolkit

Prism

Java 2D

Open GL

3D

Glass
Windowing
Toolkit

Media
Engine

Web
Engine
•Over 50+ components
•CSS skinning and layout
•Advanced UI controls
Designed by Jasper Potts http:/
/www.jasperpotts.com/blog/
Animation
Belgium
Antwerpen
FXML
javafx.stage.Stage
javafx.scene.Scene
root

parent

leaf
javafx.application.Application

public class HelloJavaFX extends Application {
Top level container

@Override
public void start(Stage stage) {

Root container

BorderPane root = new BorderPane();
Button btn = new Button("Hello JavaFX!");
root.setCenter(btn);

Place Button

Scene scene = new Scene(root, 300, 250);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}

Run...
BorderPane FlowPane

StackPane AnchorPane

GridPane

TilePane

HBox

VBox
BorderPane

+

=

HBox

StackPane

FlowPane
VBox

GridPane

AnchorPane with HBox
•All new event structure and Handler
•Working with convenience methods
•Support Multi-Touch
KeyEvent.KEY_PRESSED
InputEvent.ANY

KeyEvent.ANY

KeyEvent.KEY_RELEASED
KeyEvent.KEY_TYPED

Event.ANY

ActionEvent.ACTION

MouseEvent.ANY

MouseEvent.MOUSE_PRESSED

...

MouseEvent.MOUSE_RELEASED
...

WindowEvent.ANY

WindowEvent.WINDOW_SHOWING
WindowEvent.WINDOW_SHOWN
...
listener?

Button btn = new Button("Hello JavaFX!");
Generic Event type

Register

btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
/* Do something */
Generic Event type
}
});

Override
final Circle circle = new Circle(radius, Color.RED);
circle.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
...
}
});
circle.setOnMouseExited(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
...
}
});
EventHandler
handle
circle.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
...
}
});
ImageView view = new ImageView(android_in_apple);
view.setOnZoom(new EventHandler<ZoomEvent>() {...});
view.setOnScroll(new EventHandler<ScrollEvent>() {...});
view.setOnRotate(new EventHandler<RotateEvent>() {...});
•JavaBean Component architecture
•Expanded JavaBean properties
•In conjunction with Binding
Label mile = new Label();

KM to mile

double kmValue = 32.5;
double mileValue = kmValue * 0.621371192;
String mileText = Double.toString(kmValue);
mile.setText(mileText);
Set Label text

Double to String
KM Property Object

DoubleProperty kmPro = new SimpleDoubleProperty();
Label mile = new Label();

StringBinding Object, hold
KM to mile value

StringBinding mileBinding =
kmPro.multiply(0.621371192).asString();
mile.textProperty().bind(mileBinding);

Bind mile value to

...

Text Property

kmPro.set(32.5);
Change KM Property value
DoubleProperty kmPro = new SimpleDoubleProperty();
Label mile = new Label();

Extends Binding Class

StringBinding mileBinding = new StringBinding() {
{
Binding Property
super.bind(kmPro);
}
Override computeValue method

@Override
protected String computeValue() {
return Double.toString(kmPro.get() * 0.621371192);
}
Produce value here

};
mile.textProperty().bind(mileBinding);
...
kmPro.set(32.5);
Login.css

.root	
  {	
  
	
  	
  	
  	
  -­‐fx-­‐background-­‐image:	
  url("background.jpg");
}
.label	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
#welcome-­‐text	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
#acJontarget	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
.buKon	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
.buKon:hover	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
Scene scene = new Scene(grid, 300, 275);
scene.getStylesheets().add("login/Login.css");
Text scenetitle = new Text("Welcome");
scenetitle.setId("welcome-text");
Text actiontarget = new Text();
actiontarget.setId("actiontarget");
Login.css

.root	
  {	
  
	
  	
  	
  	
  -­‐fx-­‐background-­‐image:	
  url("background.jpg");
}
.label	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
#welcome-­‐text	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
#ac,ontarget	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
.buKon	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
.buKon:hover	
  {	
  	
  	
  	
  ...	
  	
  	
  	
  }
FXML

•XML-based language
•Separate UI from your code
•Support localize
•Support any JVM language
BorderPane border = new BorderPane();
Label topPaneText = new Label("Label - TOP");
border.setTop(topPaneText);
Button centerPaneButton = new Button("Button - CENTER");
border.setCenter(centerPaneButton);

Label

Button

BorderPane
FXML

<BorderPane>
<top>
<Label text="Label - TOP"/>
</top>
<center>
<Button text="Button - CENTER"/>
</center>
</BorderPane>
Parent root =
FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
Sample.fxml

<BorderPane>
<top>
<Label text="Label - TOP"/>
</top>
<center>
<Button text="Button - CENTER"/>
</center>
</BorderPane>
Sample.fxml

<BorderPane fx:controller="SampleController" >
<top>
<Label text="Label - TOP" fx:id="label" />
</top>
<center>
<Button text="Button - CENTER"
fx:id="button"
onAction="#handleButtonAction"/>
</center>
</BorderPane>
...
public class SampleController implements Initializable {
@FXML
private Label label;
@FXML
private Button button;

SampleController.java

}

@FXML
private void handleButtonAction(ActionEvent event) {
button.setText("Button Pressed!");
label.setText("Button Pressed!");
}
...
•UI Layout Tool
•FXML Visual Editor
•Integrated Developer Workflow
•Preview Your Work
•CSS support
ImageView

TableView

Button

ListView

Label, TextField and TextArea
SuperGrey.css

SuperNavy.css

SuperGreen.css

.theme	
  {
	
  	
  	
  	
  master-­‐color:	
  grey;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  70%);
	
  	
  	
  	
  -­‐fx-­‐font-­‐size:	
  14px;
}

.theme	
  {
	
  	
  	
  	
  master-­‐color:	
  #0049a6;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  70%);
	
  	
  	
  	
  -­‐fx-­‐font-­‐size:	
  14px;
}

.theme	
  {
	
  	
  	
  	
  master-­‐color:	
  #99cc00;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  70%);
	
  	
  	
  	
  -­‐fx-­‐font-­‐size:	
  14px;
}

.split-­‐pane	
  {
	
  	
  	
  	
  -­‐fx-­‐padding:	
  0;
	
  	
  	
  	
  -­‐fx-­‐border-­‐width:	
  0;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  100%);
}
...

.split-­‐pane	
  {
	
  	
  	
  	
  -­‐fx-­‐padding:	
  0;
	
  	
  	
  	
  -­‐fx-­‐border-­‐width:	
  0;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  100%);
}
...

.split-­‐pane	
  {
	
  	
  	
  	
  -­‐fx-­‐padding:	
  0;
	
  	
  	
  	
  -­‐fx-­‐border-­‐width:	
  0;
	
  	
  	
  	
  -­‐fx-­‐background-­‐color:	
  derive(master-­‐color,	
  100%);
}
...
•JavaFX
❖http://www.oracle.com/technetwork/java/javafx/
•NetBeans
❖http://netbeans.org/
•Make Java Sexy Again!
•JavaFX架構
•Hello JavaFX! Part 1
•Hello JavaFX! Part 2
•Hello JavaFX! Part 3
•...
http:/
/www.codedata.com.tw
Thanks
張益裕
甲骨文授權教育訓練中心	
  聯成電腦

JDD 2013 JavaFX