1
votes

Les icônes de l'interface utilisateur JavaFX peuvent-elles être écrites / enregistrées dans un fichier et récupérées ultérieurement?

Je crée une plate-forme de programmation pour enfants comme Scratch en utilisant JavaFX. J'ai une série de commandes, et quand je clique dessus, elles entrent dans ma "CodeBox" qui étend la classe JavaFX standard VBox . Bien sûr, je souhaite ajouter les fonctionnalités «enregistrer» et «reprendre» à mon code. Mais comme les objets JavaFX ne sont pas sérialisables , Je suis confronté à de graves problèmes.

Pour essayer, j'ai étendu la classe JavaFX Button

�� sr fButton׏aDN�� D 	orgSceneXD 	orgSceneYD 
orgTranslateXD 
orgTranslateYxp                                

Et ajouté une autre commande pour enregistrer cet objet fButton dans un fichier, et le fichier semble être écrit (en UTF-8):

public class fButton extends Button implements Serializable{

J'ai eu une autre commande pour lire un fButton du fichier et l'ajouter à une VBox existante. Lorsque cette commande est exécutée, un bouton vide semble être ajouté, qui ne contient pas le texte ni aucune autre propriété de fButton.

Maintenant, je veux savoir s'il existe un moyen de sauvegarder et de récupérer tous ces objets ou s'il existe un meilleur moyen.

Pour votre commodité, j'utilise JDK9.0.4 et IntelliJ IDEA Ultimate 2018.3. Merci pour votre considération.


4 commentaires

"une autre commande" - Quelles commandes avez-vous utilisées? Leur fournir.


sans rapport avec votre problème: veuillez apprendre les conventions de dénomination Java et respectez-les


ne pas enregistrer les contrôles, enregistrer leurs états


Nouveau sur Java ... Toutes les autres classes suivent les conventions de dénomination Java.


3 Réponses :


1
votes

Pour l'enregistrement et le chargement, je recommanderais d'utiliser des fichiers JSON ou XML. Avoir un dossier séparé pour les images. Lorsque vous enregistrez le fichier, enregistrez le chemin du fichier image. Vous pouvez ensuite joindre l'image ou le texte lors du chargement.

Button button = new Button();
button.setWrapText(true); //needed for text buttons
String imagePath = //this is the path to the image (save this)
Image buttonImage = new Image(imagePath);
        if (!buttonImage.isError()) {
            button.setGraphic(new ImageView(buttonImage));
        }


0 commentaires

1
votes

Le bouton n'est pas sérialisable et en hérite et l'implémentation de Serializable ne le rend pas sérialisable. Alors que se passe-t-il lors de la dés / sérialisation de fButton ?

  • à la sérialisation : la JVM ignore simplement la valeur des champs hérités et sérialise la valeur par défaut. Ce qui signifie probablement dans votre cas que la String utilisée est sérialisée comme null.

  • à la désérialisation : JVM appelle le constructeur no-arg pour la classe héritée non sérialisable. Ce qui signifie probablement dans votre cas que le Button est initialisé avec une chaîne vide comme étiquette.

Si vous souhaitez contrôler la sérialisation, lisez à propos de la sérialisation interne / externe pour avoir un meilleur contrôle. Ne vous fiez pas à la sérialisation par défaut dans votre cas.


0 commentaires

4
votes

Maintenant, je veux savoir s'il existe un moyen de sauvegarder et de récupérer tous ces objets ou s'il existe un meilleur moyen.

La sérialisation des composants de l'interface utilisateur afin de sauvegarder l'état est généralement une très mauvaise façon de faire les choses, car elle crée un couplage incroyablement étroit entre votre interface utilisateur et l'état de votre application.

Que faire si vous souhaitez remplacer une VBox par un composant StackPane personnalisé, par exemple dans une prochaine version? C'est un scénario très réaliste - peut-être voulez-vous décorer ces VBox par exemple en superposant un autre composant - mais cela détruit instantanément la capacité de quiconque de charger ensuite un fichier enregistré avec une version précédente.

Je dirais que votre état backend doit être entièrement séparé de l'interface utilisateur - vous pouvez ensuite sérialiser l'état backend seul via tout ce que vous voulez (JSON, XML, un autre sérialiseur Java, etc.) et compter sur votre rendu / Transformer la couche pour créer les composants pertinents pour votre état backend.


0 commentaires