Handles : activer, cacher, info-bulle
Chaque méthode add… renvoie un handle. Il garde l’état de l’élément avant et après l’ouverture de la fenêtre : tu peux désactiver un bouton, cacher une ligne ou expliquer un choix avec une info-bulle.
Les trois états
Un ElementHandle change trois choses sur n’importe quel élément :
| État | Méthode | Effet |
|---|---|---|
| Désactivé | setEnabled(false) | Dessiné dans une couleur atténuée, ignore la souris et le clavier. L’info-bulle s’affiche toujours au survol, pour expliquer pourquoi. |
| Caché | setVisible(false) | N’est plus dessiné et libère sa place : la fenêtre se remet en page sans lui. |
| Info-bulle | setTooltip(text) | Texte affiché au survol de l’élément. null l’enlève. |
ElementHandle confirm = window.addButton(Component.literal("Confirm"), this::confirm);confirm.setEnabled(false);confirm.setTooltip(Component.literal("Fill in the form first"));ElementHandle details = window.addText(Component.literal("Details..."));details.setVisible(false); // l’élément disparaît et libère sa placeUn changement fait fenêtre ouverte se voit à l’image suivante. Appelle les handles sur le thread client.
Pourquoi l’état vit dans le handle
Minecraft reconstruit les widgets à chaque redimensionnement. L’état vit dans le handle, pas dans le widget affiché : une case cochée reste cochée, une ligne cachée reste cachée, les nouveaux widgets relisent l’état.
Relier des éléments entre eux
Les handles permettent de lier les éléments facilement. Activer « Take » seulement quand une ligne est choisie :
ElementHandle take = buttons.addButton(Component.literal("Take"), this::take);take.setEnabled(false);list.onSelect(index -> take.setEnabled(index >= 0));Afficher une ligne seulement quand une case est cochée :
ElementHandle detail = window.addText(Component.literal("12 items, 3 different kinds"));detail.setVisible(false);CheckboxHandle showDetail = window.addCheckbox(Component.literal("Show details"), false);showDetail.onChange(detail::setVisible);Les handles spécialisés
Certains éléments renvoient un handle avec plus de méthodes. Tous sont aussi des ElementHandle.
| Handle | Renvoyé par | Ajoute |
|---|---|---|
CheckboxHandle | addCheckbox | isChecked, setChecked, onChange |
ListHandle | addList | setLines, addLine, getSelected, onSelect |
SearchHandle | addSearch | getText, setText, onChange (à chaque touche) |
ProgressHandle | addProgress | setProgress(0..1), setProgress(done, total), setLabel |
RowHandle | addRow | addText, addButton, addIconButton, addCheckbox |
TabsHandle | addTabs | addTab, getSelected, setSelected, onSelect |
onChange et onSelect ne gardent qu’une action : un nouvel appel remplace le précédent. Ils se déclenchent quand la valeur change vraiment, que le changement vienne du joueur ou de ton code.
Rangées et onglets
Sur une rangée ou une rangée d’onglets, les trois états s’appliquent à tout ce qu’elle contient :
- désactivée, une rangée désactive tous ses éléments ; une rangée d’onglets ne peut plus changer d’onglet, et le contenu affiché est désactivé aussi ;
- cachée, elle disparaît avec son contenu et libère sa place ;
- info-bulle : sur une rangée, elle s’affiche sur les éléments qui n’en ont pas ; sur une rangée d’onglets, seulement au survol des onglets, pas du contenu.
Barres de progression
Un ProgressHandle est relu à chaque image : mets-le à jour aussi souvent que tu veux, à chaque tick par exemple, sans reconstruire l’écran.
ProgressHandle craft = window.addProgress(Component.literal("Iron ingots: 0 / 64"));craft.setProgress(16, 64);craft.setLabel(Component.literal("Iron ingots: 16 / 64"));La largeur de la barre est calculée à la construction de l’écran, d’après le texte. Un texte plus long donné ensuite est coupé avec « … » jusqu’à la prochaine reconstruction.