Migrer de JBR vers Tao
Faire passer une application Nucleus existante du backend AWT au backend Tao et retester les intégrations système qui changent.
Dans ce tutoriel, vous faites passer une application Nucleus existante du backend AWT
(decorated-window-jbr ou decorated-window-jni) au backend Tao (decorated-window-tao).
Les API DecoratedWindow et TitleBar sont identiques sur les deux backends : le
changement se résume à un remplacement de dépendance et à un flag de backend. Le reste du
tutoriel couvre les intégrations à retester ensuite.
Pourquoi basculer
Sur la même machine, avec la même application compilée en image native GraalVM, le passage du backend AWT à Tao réduit nettement le temps de démarrage et la mémoire :
- Démarrage (lancement → première fenêtre) : ~0,7 s → ~0,12 s, environ 6× plus rapide.
- RAM (working set privé, au repos fenêtre ouverte) : ~155 Mo → ~100 Mo, environ 35 % de moins.
Tao abandonne complètement la hiérarchie de fenêtre AWT/Swing et ses bibliothèques natives — c'est ce qui supprime le surcoût de démarrage et de mémoire. Chiffres mesurés sur une application Nucleus interne ; les résultats varient selon la taille de l'app et la plateforme.
Avant de commencer
- Une application existante qui tourne sur
NucleusBackend.Awt, avecdecorated-window-jbroudecorated-window-jni. - JDK 17 ou version ultérieure.
- Connaître le concept de backend : une application Nucleus
n'embarque qu'un seul module de runtime de fenêtre, et
NucleusBackendle sélectionne.
Remplacer la dépendance
Remplacez le runtime de fenêtre AWT par decorated-window-tao. Le point d'entrée
nucleus.nucleus-application ne change pas.
dependencies {
implementation("dev.nucleusframework:nucleus.nucleus-application:2.0.7")
implementation("dev.nucleusframework:nucleus.decorated-window-jbr:2.0.7")
}dependencies {
implementation("dev.nucleusframework:nucleus.nucleus-application:2.0.7")
implementation("dev.nucleusframework:nucleus.decorated-window-tao:2.0.7")
}Basculer le flag de backend
Passez backend = NucleusBackend.Tao à nucleusApplication. Le contenu de la fenêtre reste
identique.
nucleusApplication {
DecoratedWindow(onCloseRequest = ::exitApplication, title = "MyApp") {
TitleBar { state -> /* … */ }
MyContent()
}
}nucleusApplication(backend = NucleusBackend.Tao) {
DecoratedWindow(onCloseRequest = ::exitApplication, title = "MyApp") {
TitleBar { state -> /* … */ }
MyContent()
}
}NucleusBackend.Auto (la valeur par défaut) choisit Tao quand decorated-window-tao est
présent au classpath, sinon il retombe sur le backend AWT. Définissez le flag explicitement
pour figer le choix par build.
Retester les intégrations système
Les API ci-dessus sont stables d'un backend à l'autre, mais les chemins d'exécution en dessous changent. Retestez chacun de ces points après le basculement :
- Drag-and-drop. Les données arrivent sous forme de
TaoDragAndDropPayloadau lieu d'unTransferHandlerAWT. Réécrivez tout handler qui lit des données de transfert AWT. - Deep links. Enregistrez-les avec
onDeepLink { uri -> … }comme avant : l'API de rappel ne change pas, seul le pont derrière diffère (TaoDeepLinkBridgesur Tao). - Dialogues fichier. Tao n'a pas d'AWT : tout appel direct à
JFileChoosercesse de fonctionner. Passez à une bibliothèque de dialogues fichier native comme FileKit — voir Dialogues fichier natifs, qui fonctionne sur les deux backends. - Vues natives. Les instances
CanvasAWT embarquées ne fonctionnent plus sous Tao. LeSwingPanelde Compose Desktop cesse lui aussi de fonctionner et fait planter l'app au runtime, car Tao ne crée jamais la hiérarchie de fenêtre AWT/Swing dont il a besoin. Embarquez du contenu natif avecNativeView. - Placement de fenêtre sur Linux. Les compositeurs Wayland peuvent ignorer les positions absolues. Voir Wayland.
- Flux multi-fenêtres. Rien ne change : un seul bloc
nucleusApplication { }avec un appelDecoratedWindowpar fenêtre, chacune exposant son propreNucleusWindow.
Comparer les backends
| Aspect | AWT (JBR / JNI) | Tao |
|---|---|---|
| Démarrage (image native) | ~0,7 s jusqu'à la première fenêtre | ~0,12 s jusqu'à la première fenêtre (~6× plus rapide) |
| RAM (repos, fenêtre ouverte) | ~155 Mo working set privé | ~100 Mo working set privé (~35 % de moins) |
| Fenêtre sous-jacente | ComposeWindow (hérite de JFrame) | TaoWindow (handle natif) |
| Dispatch d'événements | EDT AWT | Event loop Tao sur le thread principal |
Accesseur unsafe | unsafe.awtWindow | unsafe.taoWindow |
| Dialogues fichier natifs | AWT / Swing | FileKit (portails xdg / panneaux natifs) |
| Drag-and-drop | TransferHandler AWT | TaoDragAndDropPayload |
| Deep links | AWT / AppKit | TaoDeepLinkBridge (même API onDeepLink) |
| Embarquement natif | Canvas AWT | NativeView |
| Wayland | XWayland | Natif |
| Thread principal macOS | Non requis | Exige -XstartOnFirstThread |
Décider de garder JBR
Restez sur le backend AWT quand votre application :
- embarque un module basé sur Swing,
- embarque un
CanvasAWT que vous n'avez pas encore porté versNativeView, ou - dépend d'une bibliothèque qui a besoin de
ComposeWindowdirectement.
Nucleus 2.0 publie decorated-window-jbr, decorated-window-jni et decorated-window-tao
depuis la même version : vous pouvez donc différer le basculement et figer le backend par build
avec NucleusBackend.Awt ou NucleusBackend.Tao.
Et ensuite
- Backends — comment
NucleusBackendsélectionne le runtime de fenêtre. - Decorated window — les API
DecoratedWindowetTitleBarsur Tao. - Dialogues fichier natifs — des sélecteurs de fichiers qui fonctionnent sans AWT.
- Wayland — placement de fenêtre et comportement des compositeurs sous Linux.
Progression dans la barre des tâches
Affiche une progression déterminée, indéterminée ou en erreur dans la barre des tâches ou le dock depuis une fenêtre Tao.
Window & toolkits
Comment Nucleus ouvre des fenêtres desktop natives depuis Compose via le composable DecoratedWindow, le slot TitleBar et les modules de toolkit qui les restylent.