JavaFX without EDT & bind java/JavaFX
Bonjour à tous,
J'aimerai utiliser javafx sans être dans l'EDT (juste utiliser le langage fx dans une autre api graphique).
La seule façon de le faire pour moi est de définir des classes java qui font le coeur de l'API puis étendre ces classes en fx pour avoir une syntaxe purement fx.
Le pb c'est que de base on est dans l'EDT.
java :
Code:
1 2 3 4 5 6 7 8
|
public class ThreadDisplayer
{
public void whoAmI()
{
System.out.println("You are : "+Thread.currentThread().getName());
}
} |
javafx :
Code:
1 2 3 4 5 6 7
|
var displayer:ThreadDisplayer=new ThreadDisplayer();
public function run(args:String[])
{
displayer.whoAmI();
} |
Et le résultat :
Citation:
You are : AWT-EventQueue-0
Alors y a t il un moyen d'être dans un autre thread ?
On va dire que je bricole...
Voila un code qui ne "disfonctionne" pas de manière empirique.
Apres tout javafx est du byteCode java au final donc je ne vois pas de raison que l'intégration de l'api concurent ne fonctionne pas :aie:
Un code de test
Code:
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
def pool: ExecutorService = Executors.newCachedThreadPool();
var text: String = "";
var textToDisplay: String = "";
var active = true;
def sem: Semaphore = new Semaphore(1, true);
function getThreadExecutionContext(): String {
if(SwingUtilities.isEventDispatchThread()) "Thread inside EDT" else "Thread outside EDT"
}
def task: Runnable = Runnable {
override function run() {
try {
while(active) {
try {
sem.acquire();
text = "{System.nanoTime()}";
} finally {
sem.release();
}
Thread.sleep(100);
println("from runnable loop: {getThreadExecutionContext()}");
FX.deferAction(
function(): Void {
try {
sem.acquire();
textToDisplay = "{text}";
} finally {
sem.release();
}
println("from defer action: {getThreadExecutionContext()}");
}
);
}
} catch(e: Exception) {
println("{e}");
}
}
}
var activeUI: Boolean = active on replace {
active = activeUI;
};
Stage {
title : "ThreadTest"
scene: Scene {
width: 300
height: 100
content: [
HBox {
nodeVPos: VPos.CENTER
content: [
CheckBox {
text: bind "{if (not activeUI) "in" else ""}active"
selected: bind activeUI with inverse
}
Button {
text: "Button"
action: function() {
pool.execute(task);
}
}
Label {
text: bind textToDisplay
}
]
}
]
}
} |
Au profiler en tout cas on voit bien le pool et son activité et tout plein de choses gérées par javaFX