IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Sauvegarder en Java


Sujet :

Interfaces Graphiques en Java

  1. #1
    Invité
    Invité(e)
    Par défaut Sauvegarder en Java
    Bonjour a tous, tout d'abord je me présente : je suis un étudiant en ingénierie des réseaux&télécoms ayant une connaissance basique en Java et j'ai un petit problème.

    j'ai crée une JFrame (nommée Programme) en java de Gestion d'un stock, mais pas encore le main.

    je souhaitais que dans la classe main, qu'a la fin de mon travail enregistrer mes données, et qu'au relancent du programme, les recharger :

    lancement du main : si fichier existe => charger
    sinon crée l'interface (dans mon cas Programme j = new Programme(); j.setVisible(true) (cela se fera la premiere fois uniquement)

    EDIT : pas vraiment la peine de faire la condition, vu que c'est pour une seule fois, je le ferai moi-même au début, dans le main donc : charger, travailler sur l'interface.

    et dans l'interface je veux un bouton qui me permet d'enregistrer; dans la fonction enregistreractionperformed, l'enregistrement sous la forme d'un fichier.

    je ne sais pas comment faire et je suis un peu a court de temps.

    si possible aussi, est-il possible de rajouter dans le main une possibilité de sauvegarde forcée en cas de problème soudains (plantage du pc) pour éviter une perte de données ? j'ai beau cherché pour ça je n'ai rien trouvé.

    Si vous pouviez m'aider merci
    Dernière modification par Invité ; 20/07/2016 à 04h04.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Et tu coince sur quoi là dedans? Lire un fichier? Détecter qu'il existe? Ajouter une action sur un bouton? Ecrire dans un fichier?


    Pour ce qui est de mettre une action en cas de plantage soudain, ce n'est pas vraiment possible. Les planages faisant disparaitre ton interface graphique, et rendant dont impossible l'utilisation du bouton sauvegarder, ne sont pas récupérable ni interceptables.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Et tu coince sur quoi là dedans? Lire un fichier? Détecter qu'il existe? Ajouter une action sur un bouton? Ecrire dans un fichier?


    Pour ce qui est de mettre une action en cas de plantage soudain, ce n'est pas vraiment possible. Les planages faisant disparaitre ton interface graphique, et rendant dont impossible l'utilisation du bouton sauvegarder, ne sont pas récupérable ni interceptables.
    je coince sur le code a utiliser pour enregistrer sous forme de données au clic du bouton mon interface, et celui pour les recharger dessus a l’exécution du main, et non je sais manipuler les boutons, mais quoi mettre dessus pour avoir ce que je veux

    Edit : en gros quel code utiliser dans le main pour avoir : lancement du main donnera Recharger a partir d'un fichier X des données dans l'interface (jm'en fous de l'extention, du codage etc), je fais ce que je veux dessus, et ensuite avant de fermer je veux réenregistrer ce que j'ai fait, donc je veux le code pour enregistrer sous forme de ce fichier X au clic du bouton avant de fermer, et rebelote.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans l'action du bouton (ou à la fermeture de l'application), il te suffit de créer un fichier et d'écrire les informations que tu veux dedans. Au lancement de l'application, tu testes si le fichier existe, et si c'est le cas, tu lis les informations et tu les appliques.

    Un exemple, ou je stocke la position de la fenêtre et le texte saisi dans un champ, dans un fichier que je place dans un sous-dossier du dossier home :
    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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    public class DemoSaveData {
     
    	public static final String FRAME_BOUNDS = "frameBounds";
    	public static final String FIELD_TEXT = "fieldText";
     
     
    	private JFrame frame;
    	private JTextField field;
     
    	public DemoSaveData() {
    	}
     
    	public void registerFrame(JFrame frame) {
    		this.frame=frame;
    	}
    	public void registerField(JTextField field) {
    		this.field=field;
    	}
     
    	private Path getApplicationDataFile(boolean create) throws IOException {
     
    		final Path applicationDataDir = Paths.get(System.getProperty("user.home"), "monApplication"); // un dossier pour stocker les données des l'application
    		if ( create && !Files.exists(applicationDataDir) ) { // création du dossier s'il n'existe pas
    			Files.createDirectories(applicationDataDir);
    		}
    		return applicationDataDir.resolve("monFichier.dat"); // retourne un nom de fichier pour stocker les info
     
    	}
     
    	public void save() {  
    		try {
    			Path applicationDataFile = getApplicationDataFile(true);
    			// faire la sauvegarde des données
    			// par exemple, ici je sauvegarde la position de la frame et le texte dans le champ
    			try(BufferedWriter writer = Files.newBufferedWriter(applicationDataFile) ) {
    				writeData(writer, FRAME_BOUNDS, toStringData(frame.getBounds())); 
    				writeData(writer, FIELD_TEXT, field.getText()); 
    			}
    		}
    		catch(IOException e) {
    			System.err.println("Sauvegarde impossible");
    			e.printStackTrace();
    		}
    	}
     
    	private static String toStringData(Rectangle bounds) {
    		return Arrays.stream(new int[]{bounds.x,bounds.y,bounds.width,bounds.height})
    				     .mapToObj(String::valueOf)
    				     .collect(Collectors.joining(","));
    	}
     
    	private static void writeData(BufferedWriter writer, String name, String value) throws IOException {
    		writer.write(name);
    		writer.write('=');
    		writer.write(value);
    		writer.newLine(); 
    	}
     
    	public void load() {
    		try {
    			Path applicationDataFile = getApplicationDataFile(false);
    			if ( Files.exists(applicationDataFile) ) {
    				for(String line : Files.readAllLines(applicationDataFile)) {
    					String[] data = line.split("=", 2);
    					if ( data.length==2 ) {
    						switch(data[0]) {
    						case FRAME_BOUNDS:
    							frame.setBounds(readBoundsData(data[1])); 
    							break;
    						case FIELD_TEXT:
    							field.setText(data[1]);
    							break;
    						}
    					}
    				}
    			}
    		} catch (IOException e) {
    			System.err.println("Rechargement impossible");
    			e.printStackTrace();
    		}
    	}
     
    	private static Rectangle readBoundsData(String string) throws IOException {
    		try {
    			int[] bounds = Arrays.stream(string.split(","))
    					             .mapToInt(Integer::parseInt)
    					             .toArray();
    			if ( bounds.length!=4 ) {
    				throw new IOException("Not enough data: " + bounds.length + " instead of 4.");
    			}
    			return new Rectangle(bounds[0], bounds[1], bounds[2], bounds[3]);
    		}
    		catch(NumberFormatException e) {
    			throw new IOException(e);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
    		JTextField textField = new JTextField();
    		frame.add(textField, BorderLayout.SOUTH);
     
    		DemoSaveData saveData = new DemoSaveData();
    		saveData.registerFrame(frame);
    		saveData.registerField(textField);
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				saveData.save(); // on sauvegarde les données quand on ferme la fenêtre
    			}
     
    		});
     
    		frame.setSize(300, 200);
    		frame.setLocationRelativeTo(null);
     
    		saveData.load();
     
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Invité
    Invité(e)
    Par défaut
    j'ai beaucoup d'informations dans la JFrame que j'ai, je souhaiterais la sauvegarder comme elle est a la fin(a la fermeture), et les charger comme tel a la reexecution, pas seulement un champ ou la position

    ceci est beaucoup trop éloigné de mes connaissances basiques

    Edit : je veux un moyen de pouvoir reprendre la ou j'en étais juste avant fermeture, un peu comme dans Excell ou Word ou tout autre qui propose d'enregistrer
    Dernière modification par joel.drigo ; 20/07/2016 à 14h59. Motif: Citation message précédent inutile

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Omar099 Voir le message
    j'ai beaucoup d'informations dans la JFrame que j'ai, je souhaiterais la sauvegarder comme elle est a la fin(a la fermeture), et les charger comme tel a la reexecution, pas seulement un champ ou la position
    Et alors ? Stocker une info ou 500, c'est pareil. Tu pourrais envisager de sérialiser la frame, mais personnellement, je n'aime pas ça :
    • Ce n'est pas vraiment fait pour stocker (et en conséquence, ça peut poser des difficulté, en particulier avec la gestion de la version de classe)
    • On prend tout ou on prend rien, ou alors il faut personnaliser : quitte à personnaliser, autant vraiment personnaliser et donc gérer soi-même le format (au moins, on n'est pas ennuyé par la version de classe).
    • En cas de MVC, il faudra sérialiser modèle et éventuellement controlleur (s'il y a des états)


    Citation Envoyé par Omar099 Voir le message
    ceci est beaucoup trop éloigné de mes connaissances basiques
    C'est-à-dire ? Quoi est trop éloigné de tes connaissances basiques ? Ecrire un texte dans un fichier et le relire et le décoder ?

    Maintenant, il existe peut-être des API qui stockent certaines informations de préférences (j'en doute, mais on ne sait jamais, puisque àa existe couramment dans certains frameworks). Mais ça restera en général assez basique (position, taille, des trucs comme ça) et ce n'est pas sûr que tu puisses personnaliser grand chose.

    Citation Envoyé par Omar099 Voir le message
    Edit : je veux un moyen de pouvoir reprendre la ou j'en étais juste avant fermeture, un peu comme dans Excell ou Word ou tout autre qui propose d'enregistrer
    Excel et Word ne font qu'afficher le document qui était édité (une copie temporaire sauvegardée à intervalle régulier en cas de crash) : pas besoin de sauvegarder l'état de fenêtre ou je ne sais quoi. Maintenant, il y a des milliers d'informations dans chacun de ces documents, et elles sont toutes stockées dans les fichiers, y'a pas à tortiller.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est trop éloigné du moment que je n'ai rien étudié en rapport avec tout ce qui est utilisé pour ce stockage (les classes etc)

    Je ne peux pas m'amuser a enregistrer valeur par valeur, je veux tout prendre, et tout recharger

    le format ne m’intéresse pas du moment que ca ne bug pas ou ne produit pas de perte de donnée,

    EDIT : et donc est-il possible de sauvegarder aussi "temporairement" le travail fait sur cette JFrame pour ne pas perdre les données en cas de panne ?
    Dernière modification par joel.drigo ; 20/07/2016 à 15h09. Motif: suppression citation message précédent inutile (on le voit juste au-dessus)

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Omar099 Voir le message
    (les classes etc)
    Tu veux dire que tu n'as pas encore appris ce qu'était une classe en Java ?

    Peut-être es-tu alors trop ambitieux pour le programme que tu veux faire. Il n'y a pas de secret, avec le minimum de connaissances, on ne peut faire que faire des applications qui font le minimum. Maintenant, il n'y a rien dans l'exemple que je t'ai fourni qui soient d'une grande complexité et demande une grande érudition...



    Citation Envoyé par Omar099 Voir le message
    Je ne peux pas m'amuser a enregistrer valeur par valeur, je veux tout prendre, et tout recharger
    A part la sérialisation, ou une API miracle qui ferait ça, pas de solution. Sinon il n'est pas question d'amusement : la programmation c'est écrire du code. Il existera parfois des API qui t'éviteront de le faire, mais jamais pour tous tes besoins personnalisés.
    Tu es en MVC ?


    Citation Envoyé par Omar099 Voir le message
    EDIT : et donc est-il possible de sauvegarder aussi "temporairement" le travail fait sur cette JFrame pour ne pas perdre les données en cas de panne ?
    Ce n'est pas vraiment le fait de stocker temporairement, mais de stocker souvent(pour ne pas perdre une modification) et pas temporairement justement puisqu'on veut le retrouver en relançant.
    Le plus compliqué là c'est de faire une sauvegarde en tâche de fond, qui va sauvegarder à intervalle régulier. Avec un javax.swing.Timer (ou un java.util.Timer, plus performant, mais un peu plus compliqué). Encore plus compliqué (quoique), mais plus performant, sauvegarder quand le modèle passe en dirty (en particulier si tu es en MVC, ce ne sera assez simple).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Les classes je parle de celles utilisés pour cela (je n'ai jamais du importer a partir du java.io pour utiliser quoi que ce soit de la par exemple) mais je travaille bien avec les classes, compris la hiérarchie, l'API swing, etc ... en gros tout ce qui est basique

    si la serialisation est l'unique solution alors ca ne me pose pas de probleme de faire avec

    je vois pas ce que veut dire MVC, j'utilise netbeans

    et enfin bien sur je voulais dire "souvent" ici pas temporairement bien sur,

    Edit : voila mon travail : http://www.partage-fichiers.com/upload/v7pkgxef/

    tout ce qui est fait la est exactement jusqu'ou j'ai appris
    le main est juste la pour exécuter et vérifier que je n'ai rien oublier sur mes boutons, il reste le bouton imprimer mais ca n'est pas vraiment dur pour cela, il me faut le main de la facon que j'avais dit deja
    Dernière modification par joel.drigo ; 20/07/2016 à 17h15. Motif: Utilise le bouton "Répondre à la discussion" !

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Pour tout ce qui est traitement de fichier en Java, il faudra passer par java.io, ou java.nio, y compris pour faire de la sérialisation. La sérialisation qui ne sera pas forcément plus simple au final, au vu de différentes contraintes (par exemple, un ActionListener n'est pas sérialisable, ou n'importe quel autre écouteur d'évenement), ou effet difficilement contrôllable sans faire des choses assez complexe (par exemple, le fait que le curseur d'un textfield soit réinitialisé lors de la sérialisation). Autre contrainte : tu verras que si tu modifies ta fenêtre (ajoute un composant par exemple), ta sauvegarde ne fonctionnera plus (plantera au chargement).

    Personnellement, je ferais du MVC (NetBeans ou pas, ça n'empêche pas, mais je ne sais pas si la palette de NetBeans offre un mode MVC), ce qui serait beaucoup plus simple pour gérer la sérialisation.

    POC (serialisation directe de la JFrame, non MVC) :
    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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    public class Main {
     
    	public static void main(String[] args) {
    		JFrame frame = loadData();
    		if ( frame==null ) {
    			frame = createJFrame();
    		}
    		startSave(frame);
    		frame.setVisible(true);
    	}
     
    	private static void startSave(JFrame frame) {
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				saveData(frame); // sauvegarde à la fermeture
    				System.exit(0);
    			}
    		});
    		new javax.swing.Timer(1000, e-> saveData(frame)).start(); // sauvegarde toutes les secondes
    	}
     
    	private static JFrame createJFrame() {
    		JFrame frame = new JFrame("Démo");
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Label:"));
    		JTextField field = new JTextField(10);
    		panel.add(field);
    		JButton button = new JButton("truc");
    		SerialisableActionListener actionListener = e -> field.setText(""); // par défaut un ActionListener n'est pas sérialisable
    		button.addActionListener(actionListener);
    		panel.add(button);
    		frame.add(panel, BorderLayout.SOUTH);
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		return frame;
    	}
     
    	private static Path getApplicationDataFile(boolean create) throws IOException {
     
    		final Path applicationDataDir = Paths.get(System.getProperty("user.home"), "monApplication"); 
    		if (create && !Files.exists(applicationDataDir)) { /
    			Files.createDirectories(applicationDataDir);
    		}
    		return applicationDataDir.resolve("monFichier.dat");  
     
    	}
     
    	private static JFrame loadData() {
    		try {
    		Path path = getApplicationDataFile(false);
    			if ( Files.exists(path) ) {
    				try (ObjectInputStream objectinputstream = new ObjectInputStream(Files.newInputStream(path))) {
     
    					return (JFrame)objectinputstream.readObject();
     
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    			}
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    	private static void saveData(JFrame frame) {
    		try (ObjectOutputStream objectinputstream = new ObjectOutputStream(Files.newOutputStream(getApplicationDataFile(true)))) {
     
    			objectinputstream.writeObject(frame);
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	} 
     
    	public static interface SerialisableActionListener extends ActionListener, Serializable {
     
     
     
    	}
     
    }


    Voir tutoriel sur la sérialisation.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Pour tout ce qui est traitement de fichier en Java, il faudra passer par java.io, ou java.nio, y compris pour faire de la sérialisation. La sérialisation qui ne sera pas forcément plus simple au final, au vu de différentes contraintes (par exemple, un ActionListener n'est pas sérialisable, ou n'importe quel autre écouteur d'évenement), ou effet difficilement contrôllable sans faire des choses assez complexe (par exemple, le fait que le curseur d'un textfield soit réinitialisé lors de la sérialisation). Autre contrainte : tu verras que si tu modifies ta fenêtre (ajoute un composant par exemple), ta sauvegarde ne fonctionnera plus (plantera au chargement).

    Personnellement, je ferais du MVC (NetBeans ou pas, ça n'empêche pas, mais je ne sais pas si la palette de NetBeans offre un mode MVC), ce qui serait beaucoup plus simple pour gérer la sérialisation.

    POC (serialisation directe de la JFrame, non MVC) :
    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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    public class Main {
     
    	public static void main(String[] args) {
    		JFrame frame = loadData();
    		if ( frame==null ) {
    			frame = createJFrame();
    		}
    		startSave(frame);
    		frame.setVisible(true);
    	}
     
    	private static void startSave(JFrame frame) {
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				saveData(frame); // sauvegarde à la fermeture
    				System.exit(0);
    			}
    		});
    		new javax.swing.Timer(1000, e-> saveData(frame)).start(); // sauvegarde toutes les secondes
    	}
     
    	private static JFrame createJFrame() {
    		JFrame frame = new JFrame("Démo");
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Label:"));
    		JTextField field = new JTextField(10);
    		panel.add(field);
    		JButton button = new JButton("truc");
    		SerialisableActionListener actionListener = e -> field.setText(""); // par défaut un ActionListener n'est pas sérialisable
    		button.addActionListener(actionListener);
    		panel.add(button);
    		frame.add(panel, BorderLayout.SOUTH);
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		return frame;
    	}
     
    	private static Path getApplicationDataFile(boolean create) throws IOException {
     
    		final Path applicationDataDir = Paths.get(System.getProperty("user.home"), "monApplication"); 
    		if (create && !Files.exists(applicationDataDir)) { /
    			Files.createDirectories(applicationDataDir);
    		}
    		return applicationDataDir.resolve("monFichier.dat");  
     
    	}
     
    	private static JFrame loadData() {
    		try {
    		Path path = getApplicationDataFile(false);
    			if ( Files.exists(path) ) {
    				try (ObjectInputStream objectinputstream = new ObjectInputStream(Files.newInputStream(path))) {
     
    					return (JFrame)objectinputstream.readObject();
     
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    			}
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    	private static void saveData(JFrame frame) {
    		try (ObjectOutputStream objectinputstream = new ObjectOutputStream(Files.newOutputStream(getApplicationDataFile(true)))) {
     
    			objectinputstream.writeObject(frame);
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	} 
     
    	public static interface SerialisableActionListener extends ActionListener, Serializable {
     
     
     
    	}
     
    }


    Voir tutoriel sur la sérialisation.
    ca marche presque avec ton code, par contre ou tu as enregistré les fichiers, j'ai apporté des modifications et je dois supprimer le fichier pour reessayer mais je ne sais pas ou c'est mis j'ai beau chercher tu peux me dire pour savoir si ca marche a 100%, aussi j'ai augmenté le temps de sauvegarde toutes les secondes le curseur revient a sa place je ne peux rien ecrire

    EDIT : trouvé je te dis ce qu'il en est

    EDIT : ca marche c'est bon c'est parfait UN GRAND MERCI jpense me pencher dessus les jours a venir le temps de comprendre un peu lprocessus peut etre je saurais mieux utiliser le reste je vais encore tester un peu tout

    EDIT : encore quelques soucis
    Dernière modification par joel.drigo ; 20/07/2016 à 17h49. Motif: Suppression citation message précédent inutile

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Omar099 Voir le message
    ca marche presque avec ton code, par contre ou tu as enregistré les fichiers,
    Dans "user.home"/monApplication (j'ai mis monApplication, mais ce serait mieux que tu remplaces ça par le nom de ton application (!)).
    "user.home" ça correspond à ton dossier utilisateur (dépend de l'OS surlequel tu opères) : tu peux tout simplement faire un System.out.println pour connaître l'emplacement.

    Citation Envoyé par Omar099 Voir le message
    j'ai augmenté le temps de sauvegarde toutes les secondes le curseur revient a sa place je ne peux rien ecrire
    C'est ce que je t'ai dit : il y a des effets incontrollables (vient du code dans la classe Swing) et en particulier celui-là, qui est particulièrement gênant. Il y a probablement des workarounds (par écouteurs par exemple), mais ce n'est pas simple à priori.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Invité
    Invité(e)
    Par défaut
    voila mon probleme : le chargement marche mais les boutons au nouveau lancement du programme ne fonctionnent plus :

    voila ce que j'ai laissé dans mon main apres modifications selon mon travail :



    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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    package Fournisseur;
    import java.awt.event.*;
    import java.io.*;
    import java.nio.file.*;
    import javax.swing.*;
    public class Tester {
     
    	public static void main(String[] args) {
                	Programme frame;
                frame = loadData();
    		if ( frame==null ) {
    			frame = new Programme();
                            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                            frame.setLocationRelativeTo(null);
    		}
    		startSave(frame);
    		frame.setVisible(true);
    	}
     
    	private static void startSave(Programme frame) {
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				saveData(frame); // sauvegarde à la fermeture
    				System.exit(0);
    			}
    		});
    		new javax.swing.Timer(10000, e-> saveData(frame)).start(); // sauvegarde toutes les secondes
    	}
     
     
    	private static Path getApplicationDataFile(boolean create) throws IOException {
     
    		final Path applicationDataDir = Paths.get(System.getProperty("user.home"), "monApplication"); // un
    																										// dossier
    																										// pour
    																										// stocker
    																										// les
    																										// données
    																										// des
    																										// l'application
    		if (create && !Files.exists(applicationDataDir)) { // création du
    															// dossier s'il
    															// n'existe pas
    			Files.createDirectories(applicationDataDir);
    		}
    		return applicationDataDir.resolve("monFichier.dat"); // retourne un nom
    																// de fichier
    																// pour stocker
    																// les info
     
    	}
     
    	private static Programme loadData() {
    		try {
    		Path path = getApplicationDataFile(false);
    			if ( Files.exists(path) ) {
    				try (ObjectInputStream objectinputstream = new ObjectInputStream(Files.newInputStream(getApplicationDataFile(true)))) {
     
    					return (Programme)objectinputstream.readObject();
     
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    			}
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
     
    	private static void saveData(Programme frame) {
    		try (ObjectOutputStream objectinputstream = new ObjectOutputStream(Files.newOutputStream(getApplicationDataFile(true)))) {
     
    			objectinputstream.writeObject(frame);
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	} 
     
    	public static interface SerialisableActionListener extends ActionListener, Serializable {
     
     
     
    	}
     
    }
    c'est le seul probleme qu'il y a ! presque !!!

    EDIT : premier lancement (sans chargement) les boutons marchent, fermeture = sauvegarde, relancement il y a le chargement, MAIS les boutons ne fonctionnent plus
    Dernière modification par joel.drigo ; 20/07/2016 à 17h53. Motif: Ajout balise CODE + MP

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Omar099 Voir le message
    voila mon probleme : le chargement marche mais les boutons au nouveau lancement du programme ne fonctionnent plus :
    oui :
    Citation Envoyé par joel.drigo Voir le message
    par exemple, un ActionListener n'est pas sérialisable, ou n'importe quel autre écouteur d'évenement)
    C'est pour ça que j'ai créé l'interface SerializableActionListener en l'occurance (il faut remplacer tous les appels du type comp.addActionListener(new ActionListener() { ... } par comp.addActionListener(new SerializableActionListener() { ... } }. Il faudra faire le même genre de manip pour les autres écouteurs (sélection dans les listes, les tables, les combo, etc.).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  15. #15
    Invité
    Invité(e)
    Par défaut
    ah d'accord Merci je vais faire ca et vous tenir au courant

    EDIT : MERCI bcp tout fonctionne c'est bon, j'ai perdu la possibilité de modifier l'interface il ne me reste que le code a cause du fait que je ne peux pas toucher a InitComponents() dans netbeans, mais heureusement il me rester seuelement a faire le bouton Imprimer, je veux imprimer un JPanel tel qu'il est au clic du bouton
    Dernière modification par Invité ; 20/07/2016 à 19h28.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2009, 14h03
  2. Sauvegarde en JAVA
    Par lezert dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2008, 15h36
  3. selenium RC lancer un testcase sauvegardé en .java
    Par meteteou dans le forum Test
    Réponses: 1
    Dernier message: 02/04/2008, 11h15
  4. Sauvegarder une instance d'une classe Java dans une BDD MySQL
    Par malag dans le forum Administration
    Réponses: 1
    Dernier message: 03/09/2006, 19h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo