Je souhaite pouvoir enregistrer mes objets Carte dans le fichier "CardsColleciton.txt" (soit en tapant dessus, soit en les codant en dur) puis charger ces objets dans ma liste testingList afin que je puisse les afficher correctement. Cependant, j'ai essayé une tonne de choses mais je n'arrive pas à comprendre pourquoi les deux problèmes suivants se produisent:L'enregistrement et l'importation à partir d'un fichier .txt provoquent l'écrasement des données
1) Chaque fois J'écris dans le fichier .txt soit en codant en dur ou en tapant dedans, mon code les charge très bien mais après la fermeture du programme, les données sont supprimées et je dois recommencer. 2) Si je code dur les objets, ils apparaissent dans ma liste mais quand j'écris normalement dans le fichier .txt, le code dit qu'ils ont été chargés (et ils étaient, la taille de la liste de test augmente) mais ne les affiche pas sur le listView.
J'espère que quelqu'un ici peut m'aider à comprendre ces deux-là. PS: J'ai lu beaucoup d'autres articles similaires sur le 1er problème, mais aucun d'entre eux résolu le mien.
Voici mes fichiers .java:
Card.java:
package com.spdesigns.dokkancardspreview.model;
import javafx.scene.image.Image;
public class Card {
private String mName;
private String mDescription;
private Image mMainImage;
private Image mSecondaryImage;
public Card(String name, String description, String mainImagePath, String secondaryImagePath) {
mName = name;
mDescription = description;
mMainImage = new Image(mainImagePath);
mSecondaryImage = new Image(secondaryImagePath);
}
@Override
public String toString() {
return mName + " | " + mDescription;
}
public Image getmMainImage() {
return mMainImage;
}
public Image getmSecondaryImage() {
return mSecondaryImage;
}
public String getName() {
return mName;
}
public String getDescription() {
return mDescription;
}
}
contrôleur
-> home.java:
package com.spdesigns.dokkancardspreview.controllers;
import com.spdesigns.dokkancardspreview.model.Card;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.io.*;
import java.util.List;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
public class home implements Initializable {
/*private Card hit = new Card("Hit","Expanding Possibility",
"/images/hit_main.jpg", "/images/hit_secondary.jpg");*/
// This is how I "hard-code" the object so that the 2nd issue does not occur
private Card goku = new Card("Goku SSJ3","Everlasting Legend",
"/images/gokussj3_main.jpg", "/images/gokussj3_secondary.jpg");
private boolean clickedAgain = false;
@FXML
private Button arrowButton;
@FXML
private ImageView imageView;
@FXML
private ImageView arrow;
@FXML
private ListView listView;
protected List<Card> testingList = new ArrayList<Card>();
protected ListProperty<Card> listProperty = new SimpleListProperty<Card>();
@Override
public void initialize(URL location, ResourceBundle resources) {
//addCard(hit);
addCard(goku);
//testingList.add("test2");
listView.itemsProperty().bind(listProperty);
// wrapping our list in an observable list and then pass that observableList to the ListProperty isntance
listProperty.set(FXCollections.observableArrayList(testingList));
// Handle listView selection changes
listView.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex());
System.out.printf("ListView item clicked! Value retrieved: %s\n", currentlySelectedCard);
imageView.setImage(new Image(currentlySelectedCard.getmMainImage().impl_getUrl()));
arrow.setVisible(true);
arrowButton.setVisible(true);
}));
arrow.translateYProperty().set(283f);
arrowButton.translateYProperty().set(283f);
arrow.setRotate(180);
arrow.setVisible(false);
arrowButton.setVisible(false);
}
public void handleShowDetails(ActionEvent actionEvent) {
System.out.println("Button Clicked!");
Card currentlySelectedCard = listProperty.get(listView.getSelectionModel().getSelectedIndex());
if (clickedAgain) {
imageView.setImage(new Image(currentlySelectedCard.getmMainImage().impl_getUrl()));
arrow.setRotate(180);
clickedAgain = false;
} else {
imageView.setImage(new Image(currentlySelectedCard.getmSecondaryImage().impl_getUrl()));
arrow.setRotate(360);
clickedAgain = true;
}
}
// Saving
public void exportTo(String fileName) {
try (
FileOutputStream fos = new FileOutputStream(fileName);
PrintWriter writer = new PrintWriter(fos);
) {
for (int i = 0; i < testingList.size() - 1; i++) {
writer.printf("%s|%s|%s|%s\n", testingList.get(i).getName(), testingList.get(i).getDescription(),
testingList.get(i).getmMainImage().impl_getUrl(), testingList.get(i).getmSecondaryImage().impl_getUrl());
System.out.println(testingList.get(i).toString());
}
} catch (IOException ioe) {
System.out.printf("Problem saving: %s/n", fileName);
ioe.printStackTrace();
}
}
// Loading
public void importFrom(String fileName) {
try (
FileInputStream fis = new FileInputStream(fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
) {
String line;
while ((line = reader.readLine()) != null) {
String[] args = line.split("\\|");
this.addCard(new Card(args[0], args[1], args[2], args[3]));
}
} catch (IOException ioe) {
System.out.printf("Problem loading: %S\n", fileName);
ioe.printStackTrace();
}
int i = 0;
for (Card card : testingList) {
System.out.printf("%s loaded\n", testingList.get(i).toString());
i++;
}
System.out.println("Loading Successful!");
}
public void addCard(Card card) {
testingList.add(card);
}
// DEBUG purposes
public void printTestingList() {
for (Card card : testingList) {
System.out.println(card.toString());
}
}
}
Main.java:
package com.spdesigns.dokkancardspreview;
import com.spdesigns.dokkancardspreview.controllers.home;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.File;
public class Main extends Application {
private home controller;
private File file = new File("CardsCollection.txt");
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/home.fxml"));
Parent root = loader.load();
controller = loader.getController();
primaryStage.setTitle("Dokkan Battle Card Preview");
primaryStage.setScene(new Scene(root, 900, 700));
primaryStage.setResizable(false);
// Loading cards
primaryStage.show();
try {
if(!file.exists()) {
file.createNewFile();
}
controller.importFrom("CardsCollection.txt");
} catch (NullPointerException npe) {
System.out.println("Error loading file!");
npe.printStackTrace();
}
}
//TODO:sp Fix when closisng the app-saving, the .txt file gets reseted
@Override
public void stop() {
System.out.println("App is closing!");
// Saving before exiting
try {
controller.exportTo("CardsCollection.txt");
System.out.println("Saving was successful!\n");
} catch (NullPointerException npe) {
System.out.println("Problem saving file!");
npe.printStackTrace();
}
controller.printTestingList();
// System.out.println(file.);
}
public static void main(String[] args) {
launch(args);
}
}
Eh bien d'abord de tout ce que je recommande d'écrire dans un fichier csv au lieu de juste un fichier txt simple car ils sont assez faciles à manipuler et presque la même chose. Il y a aussi des tonnes d'API que vous pouvez utiliser pour les fichiers csv. –
@AlexanderHeim, j'ai créé un projet de test pour pouvoir utiliser un fichier csv mais le problème où tout ce qui est dans le fichier est supprimé après la fin du programme est toujours présent ... Je vais continuer à chercher mais si vous connaissez les causes ça me le fait savoir! Merci d'avance. EDIT: ce problème se produit lorsque j'écris une fois dans le fichier, puis je commente les lignes qui écrivent dans le fichier, ne laissant que le code pour la lecture. Est-ce que c'est faux? –
Est-ce que le fichier est supprimé ou est-ce que le contenu disparaît? Eh bien, je ne commenterais pas les lignes qui écrivent dans le fichier. Essayez de diviser la lecture et l'écriture en différentes méthodes. Quelle API utilisez-vous? –