construire une application javafx 8 avec gradle
DESCRIPTION
JavaFX 8 est disponible depuis mars 2014 et apporte son lot de nouveautés. Gradle est en version 2 depuis juillet 2014. Deux technologies plus que prometteuses: JavaFX donne un coup de jeune au développement d’applications desktop en Java en apportant un navigateur web intégré, le support des WebSockets, de la 3D, et bien d’autres. Gradle est l’outil de d’automatisation de build à la mode, apportant de superbes possibilités par rapport rapport à maven, outil vieillissant, grâce à l’engouement de la communauté vis à vis de cet outil mais aussi par le fait de la technologie utilisée en son sein: groovy. Venez découvrir comment il est possible de réaliser rapidement une application à la mode en JavaFX avec un outil à la mode également. Bref venez à une session trendy.TRANSCRIPT
![Page 1: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/1.jpg)
Construire une application JavaFX 8 avecgradle
![Page 2: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/2.jpg)
Thierry Wasylczenko
@twasyl
Construire une application JavaFX 8 avec gradleLa session trendy
![Page 3: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/3.jpg)
3
![Page 4: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/4.jpg)
Ce dont on va parler
• JavaFX 8
• gradle
• Tooling
• De code
4
![Page 5: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/5.jpg)
#JavaFX 8:
5
![Page 6: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/6.jpg)
De 2 à 8
![Page 7: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/7.jpg)
Les Properties
![Page 8: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/8.jpg)
Les types
IntegerProperty intP = new SimpleIntegerProperty();
DoubleProperty doubleP = new SimpleDoubleProperty();
// ...
BooleanProperty booleanP = new SimpleBooleanProperty();
StringProperty stringP = new SimpleStringProperty();
ObjectProperty<SoftShake> objectP = new SimpleObjectProperty();
8
![Page 9: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/9.jpg)
Le binding
IntegerProperty intP1 = new SimpleIntegerProperty();
IntegerProperty intP2 = new SimpleIntegerProperty();
intP1.bind(intP2);
intP2.set(10);
System.out.println("Et P1? " + intP1.get());
9
![Page 10: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/10.jpg)
Le binding
IntegerProperty intP1 = new SimpleIntegerProperty();
IntegerProperty intP2 = new SimpleIntegerProperty();
intP1.bindBidirectional(intP2);
intP2.set(10);
System.out.println("Et P1? " + intP1.get());
intP1.set(20);
System.out.println("Et P2? " + intP2.get());
10
![Page 11: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/11.jpg)
Les événements
IntegerProperty intP1 = new SimpleIntegerProperty();
intP1.addListener((valueInt, oldInt, newInt) -> {
System.out.println("Change");
});
intP1.set(10);
11
![Page 12: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/12.jpg)
POJO 2.0
public class Conference {
private StringProperty name = new SimpleStringProperty();
public StringProperty nameProperty() { return this.name; }
public String getName() { return this.name.get(); }
public void setName(String name) { this.name.set(name); }
}
final Conference softShake = new Conference();
tf.textProperty().bindBidirectional(softShake.nameProperty());
12
![Page 13: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/13.jpg)
Pas serializable
![Page 14: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/14.jpg)
POJO 1.5
public class Conference {
private PropertyChangeStatus pcs =
new PropertyChangeStatus(this);
private String name;
public void addPropertyChangeListener(PropertyChangeListener listener)
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener)
this.pcs.removePropertyChangeListener(listener);
14
![Page 15: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/15.jpg)
POJO 1.5
final Conference softShake = new Conference();
JavaBeanStringPropertyBuilder builder = new ...
JavaBeanStringProperty nameProperty = builder.bean(softShake)
.name("name")
.build();
nameProperty.addListener((valueName, oldIName, newName) -> {
// ...
});
15
![Page 16: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/16.jpg)
Vues
![Page 17: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/17.jpg)
FXML
<AnchorPane xmlns:fx="http://javafx.com/fxml"
fx:controller="org.mycompany.Controller">
<stylesheets>
<URL value="@/org/mycompany/css/Default.css" />
<URL value="@/org/mycompany/css/Specialized.css" />
</stylesheets>
<Button fx:id="myButton" text="Button" onAction="#click" />
<TextField fx:id="myTextField" promptText="Enter something" />
</AnchorPane>
17
![Page 18: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/18.jpg)
Controller
public class Controller implements Initializable {
@FXML private Button myButton;
@FXML private TextField myTextField;
@FXML private void click(ActionEvent evt) { /* ... */ }
@Override
public void initialize(URL url, ResourceBundle resourceBundle)
// ...
}
}
18
![Page 19: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/19.jpg)
CSS
![Page 20: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/20.jpg)
Personnaliser les composants
FXML
<Button style="-fx-text-fill: white" styleClass="awesome" />
Java
button.setStyle("-fx-background-color: red;");
button.getStyleClass().add("awesome");
20
![Page 21: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/21.jpg)
Personnaliser les composants
Feuille de style
.button {
-fx-text-fill: white;
-fx-background-color: red;
}
.button:hover { -fx-background-color: blue; }
.awesome { -fx-background-color: gray; }
#myButton { -fx-text-fill: black; }
21
![Page 22: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/22.jpg)
PseudoState personnalisés
PseudoClass ps = PseudoClass.getPseudoClass("awesome");
myButton.pseudoClassStateChanged(ps, true);
.button:awesome {
-fx-text-fill: orange;
}
#myButton:awesome {
-fx-text-fill: green;
}
22
![Page 23: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/23.jpg)
WebView
![Page 24: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/24.jpg)
JS <> JFX
webview.getEngine().getLoadWorker().stateProperty().addListener((observableValue, oldState, newState) -> {
if (newState == Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webview.getEngine()
.executeScript("window");
window.setMember("javaObj",this);
}
});
24
![Page 25: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/25.jpg)
JS <> JFX
Java
WebEngine engine = webview.getEngine();
String result = engine.executeScript("return 'Hello';");
JavaScript
javaObj.myWonderfulMethod("Hello");
25
![Page 26: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/26.jpg)
WebSocket
window.onload = function() {
socket = new WebSocket("ws://mycompany.com/ws");
socket.onopen = function(event) { /* ... */ };
socket.onclose = function(event) { /* ... */ };
socket.onmessage = function(event) { /* ... */ };
};
26
![Page 27: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/27.jpg)
Drag'n'drop
![Page 28: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/28.jpg)
Drag'n'drop
obj.setOnDragDetected(event -> { /* ... */ });
obj.setOnDragOver(event -> { /* ... */ });
obj.setOnDragEntered(event -> { /* ... */ });
obj.setOnDragExited(event -> { /* ... */ });
obj.setOnDragDropped(event -> { /* ... */ });
obj.setOnDragDone(event -> { /* ... */ });
28
![Page 29: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/29.jpg)
Printing API
![Page 30: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/30.jpg)
Chaque Node
PrinterJob job = PrinterJob.createPrinterJob();
job.printPage(myTextField);
Une page web
WebView view = new WebView();
PrinterJob job = PrinterJob.createPrinterJob();
view.getEngine().print(job);
30
![Page 31: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/31.jpg)
3D
![Page 32: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/32.jpg)
Objets prédéfinis
Box b = new Box(width, height, depth);
Cylinder c = new Cylinder(radius, height);
Sphere s = new Sphere(radius);
TriangleMesh tm = new TriangleMesh();
Les plus basiques
32
![Page 33: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/33.jpg)
Camera & Light
Camera camera = new PerspectiveCamera(true);
scene.setCamera(camera);
PointLight point = new PointLight(Color.RED);
AmbientLight ambient = new AmbientLight(Color.WHITE);
scene.getRoot().getChildren().addAll(point, ambient);
Ne pas oublier de positionner les objets
33
![Page 34: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/34.jpg)
#gradle:
34
![Page 35: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/35.jpg)
Flexibilité
![Page 36: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/36.jpg)
Task
• Réponds à MON besoin
• Dynamisme
• Dépendances
• Greffage au cycle de vie
task sofshake << {
println 'Hello Soft-Shake 2014'
}
tasks['sofshake'].dependsOn 'jar'
36
![Page 37: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/37.jpg)
Task: surcharge
apply plugin: 'java'
task jar(overwrite: true) << {
// ...
manifest {
// ...
}
}
37
![Page 38: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/38.jpg)
Dépendances
dependencies {
compile (':my-project')
runtime files('libs/a.jar', 'libs/b.jar')
runtime "org.groovy:groovy:2.2.0@jar"
runtime group: 'org.groovy', name: 'groovy', version: '2.2.0', ext:
}
38
![Page 39: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/39.jpg)
Copy
• Copier des fichiers facilement
• La roue est déjà inventée
copy {
from file1
from file2
into folder
}
39
![Page 40: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/40.jpg)
Gradle wrapper
• Execution de gradle sans intallation préalable
• Plateformes d’intégration continue friendly
task buildGradleWrapper(type: Wrapper) {
gradleVersion = '2.1'
}
40
![Page 41: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/41.jpg)
Ouvert
![Page 42: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/42.jpg)
![Page 43: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/43.jpg)
![Page 44: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/44.jpg)
Intégration de Ant
• Variables
• Tâches
ant.importBuild "ant/project/file.xml"
ant.conference = "Soft-Shake 2014"
ant.location = "Genève"
maTacheAnt.execute()
44
![Page 45: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/45.jpg)
Tooling
45
![Page 46: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/46.jpg)
SceneBuilder 46
![Page 47: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/47.jpg)
ScenicView 47
![Page 48: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/48.jpg)
TestFX
public class DesktopTest extends GuiTest {
public Parent getRootNode() { return new Desktop(); }
@Test public void testMe() {
// Given
rightClick("#desktop").move("New").click("Text Document")
.type("myTextfile.txt").push(ENTER);
// When
drag(".file").to("#trash-can");
// Then
verifyThat("#desktop", contains(0, ".file"));
48
![Page 49: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/49.jpg)
#Code
49
![Page 50: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/50.jpg)
Codons !
• JavaFX 8
• Properties
• FXML
• Styling
• gradle
• Dépendances
• Build
50
![Page 51: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/51.jpg)
Ressources 51
![Page 52: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/52.jpg)
Ressources
• https://github.com/TestFX/TestFX
• http://fxexperience.com/
• http://fxexperience.com/controlsfx/
• Source code of the demo: https://bitbucket.org/twasyl/weatherfx
52
![Page 53: Construire une application JavaFX 8 avec gradle](https://reader034.vdocument.in/reader034/viewer/2022050907/55904a9a1a28aba6718b4587/html5/thumbnails/53.jpg)
53