salut tous le monde.
j'essaye de découvrir la technologie javaFX et je veut savoir si je peut appeler
un morceau de code écrit en javaFX dans un programme java ?
si c'est possible , alors comment procéder ?
merci pour votre réponse.
salut tous le monde.
j'essaye de découvrir la technologie javaFX et je veut savoir si je peut appeler
un morceau de code écrit en javaFX dans un programme java ?
si c'est possible , alors comment procéder ?
merci pour votre réponse.
Ma Chaine youtube : https://www.youtube.com/@medBkDev
Mes Articles
guide du débutant pour apprendre à programmer en Java -
FAQ Java et les cours et tutoriels Java
Bonsoir,
Pour pouvoir procéder à ce dont tu souhaites, il faut utiliser une astuce.
Toutes les informations ici.
Bon courage,
Mes liens: Profil | Blog
Mes articles Java : JSF 2.0 | NetBeans 6.9/OSGi
Mes articles Webmarketing : Apprenez à mixer, filtrer, différentes sources de flux (RSS,...)
Vidéos pour les membres :
James Gosling - Créateur du langage Java
Chris Melissinos - Chef Evangéliste
Réseaux sociaux: Twitter Webmarketing | Facebook Webmarketing
EDIT - et là je me suis rendu compte en relisant que j'avais compris la question dans le sens inverse, preuve que je ne suis pas bien réveillé ce matin , voir plus bas.
Tu l'appelles... exactement comme si tu l'appelais depuis un bout de code en Java. Donc :
- Ton JAR, zip ou répertoire contenant les classes doit être dans le CLASSPATH.
- Tu dois importer le package ou classes nécessaires.
- Tu instancies tes objets Java :
- Soit par une instanciation directe avec new et un appel à l'un des constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 import javax.swing.JFrame; def frame = new JFrame("Title");- Soit "à la JavaFX" en créant une classe anonyme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 import javax.swing.JFrame; def frame = JFrame { } frame.setTitle("title");- Une classe JavaFX peut hériter directement d'une classe Java et d'une infinité d'interfaces Java :
Par contre il faut que la classe mère ait un constructeur par défaut (sans paramètre) accessible il me semble.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public class MaClasse extends JButton, ActionListener, ComponentListener { init { setText("Cliquez sur le bouton !"); addActionListener(this); addComponentListener(this); } public override function actionPerformed(e:ActionEvent):Void { [...] } public override function componentResized(e:ComponentEvent):Void { [...] } [...] } [...] def frame = new JFrame("Swing Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new FlowLayout(FlowLayout.LEFT)); frame.add(MaClasse{}); frame.pack(); frame.setVisible(true); Stage { title: "FX Stage" scene: Scene { content: SwingComponent.wrap(MaClasse{}) } onClose: function():Void { FX.exit(); } }
Les choses à savoir sont :
- Pas de support des Generics, donc, quand on utilise des collections ou des classes généricifiées, c'est comme ci on faisait du Java pre-1.5 : on manipule des classes contenant des Object, il faudra donc caster avec le mot-clé as.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // Si on etait dans du Java on aurait reçu une List<Integer>, ici on reçoit une List<Object>. def intList:List = ... def value:Integer = intList.get(0) as Integer;- Les séquences JavaFX NE SONT pas des tableaux Java. Généralement quand le code n'est pas trop tordu on peut passer de l'un à l'autre mais parfois pas. JavaFX 1.2 a rajouté le support des tableaux natifs (tableaux Java) ce qui permet de faciliter le problème :
On peut utliser la syntaxe [] sur les nativearray, par contre les operateurs tels que insert, delete et slice generent des exceptions bien sur (puisque les tableaux Java sont de taille imutable).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // Convertit une sequence d'Integer en un Integer[] def intArray:nativeArray of Integer = [1,2, 3, 4] as nativeArray of Integer;- Parfois il m'est arrivé dans JavaFX 1.0 et 1.1 (pas trop fait gaffe en 1.2 puisque j'avais déjà refactorisé mon code) qu'il n'arrive pas à déterminer quelle méthode Java appeler quand on avait, dans notre classe Java, des signatures dans le style :
Donc pour régler ce problème, dans ton projet JavaFX tu insères une classe Java (tu peux avoir du code Java dans ton projet JavaFX, c'est utile si tu dois faire des interfaces ou des enums par exemple) qui a des méthodes du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public class Truc { public int calculateDistance(int x1, int y1, int x2, int y2) { [...] } public float calculateDistance(float x1, float y1, float x2, float y2) { [...] } public double calculateDistance(double x1, double y1, double x2, double y2) { [...] }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Bidule { private Truc delegated = new Truc(); public int calculateDistanceAsInt(int x1, int y1, int x2, int y2) { return delegated.calculateDistance(x1, y1, x2, y2) { } public float calculateDistanceAsFloat(float x1, float y1, float x2, float y2) { return delegated.calculateDistance(x1, y1, x2, y2) { } public double calculateDistanceAsDouble(double x1, double y1, double x2, double y2) { return delegated.calculateDistance(x1, y1, x2, y2) { } }
-- EDIT--
Sinon via le mecanisme de l'héritage (à partir d'une interface ou classe abstraite ou classe Java), il est tout à fait possible de fournir à des classes pure-Java des listeners, observateurs, classes délégées ou n'importe quel type d'objet qui suive une pattern quelconque et qui soit en fait écrit en JavaFX.
Le principal problème est celui de l'instanciation : autant il est facile d'instancier une classe FX depuis du code FX autant ca peut être galère depuis du code Java, les principales solutions sont (voir dans la FAQ et les propositions pour la FAQ) :
- Faire un projet JavaFX, il n'y a alors aucun problème pour instancier les classes FX. C'est simple mais pas forcément top quand tout le reste du projet est intégralement en Java (nottament car dans NetBeans le déboggeur dans un projet JavaFX a vraiment du mal quand il doit traverser des classes en Java).
- Utiliser les classes de réflection JavaFX. C'est un peu lourd mais ça marche, c'est ce que fait l'exemple de Sun. A noter que la dernière version de JFXtras permet de créer un objet/contrôle JavaFX héritant de javafx.scene.Scene dans un composant Swing de cette manière mais en cachant toute la partie réflection à l'utilisateur.
- Utiliser l'API de l'interpréteur de script pour interpréter dynamiquement un script FX qui générera la classe nécessaire. Comme c'est du code interprété dynamiquement on perd un peu tout ce qui est vérification à la compilation (il est donc bienvenu de tester le code séparément avant de l'intégrer dans le projet).
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Partager