2017-09-19 1 views
1

J'ai une classe Card qui contient deux constructeurs comme vous pouvez le voir dans mon code ci-dessous. Le problème est que chaque objet Card prend 2 chaînes et 2 images et que je veux sauvegarder ces objets Je dois sauvegarder les chemins des images en tant que Strings et ensuite les récupérer, donc les 2 constructeurs. Cependant, en utilisant certaines instructions d'impression, j'ai découvert que chaque fois qu'une carte est récupérée, 2 objets distincts sont créés: un normal et un autre qui est nul. Je comprends que cela arrive parce que j'ai créé une nouvelle carte en utilisant le 1er constructeur dans le 2ème. Y a-t-il un moyen de l'éviter pour ne pas avoir 2 objets séparés? Je voudrais trouver un moyen d'utiliser un seul constructeur si possible.Here sont mes classes:Créer un seul objet en utilisant deux constructeurs différents

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; 
private String mMainImagePath; 
private String mSecondaryImagePath; 

public Card(String name, String description, Image mainImage, Image secondaryImage) { 
    mName = name; 
    mDescription = description; 
    mMainImage = mainImage; 
    mSecondaryImage = secondaryImage; 
} 

public Card(String name, String description , String mainImagePath, String secondaryImagePath) { 
    Card newCardToAdd = new Card(name,description,new Image(mainImagePath),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; 
} 
} 

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", 
     new Image("/images/hit_main.jpg") , new Image("/images/hit_secondary.jpg")); 

private Card goku = new Card("Goku SSJ3","Everlasting legend", 
     new Image("/images/gokussj3_main.jpg") , new Image("/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(); 
    } 
} 

@Override 
public void stop() { 
    System.out.println("App is closing!"); 
    // Saving before exiting 
    try { 
     controller.exportTo("CardsCollection.txt"); 
    } catch (NullPointerException npe) { 
     System.out.println("Problem saving file!"); 
     npe.printStackTrace(); 
    } 
    // controller.printTestingList(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 
} 

Répondre

1

changement

public Card(String name, String description , String mainImagePath, String secondaryImagePath) { 
    Card newCardToAdd = new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath)); 
} 

à

public Card(String name, String description , String mainImagePath, String secondaryImagePath) { 
    this(name,description,new Image(mainImagePath),new Image(secondaryImagePath)); 
} 
+0

Notez que cette solution laisse 'mMainImagePath' et' mSecondaryImagePath 'champs non initialisés. –

+0

@MickMnemonic Oui, mais ces champs sont privés et non accessibles, peut-être ces champs devraient être supprimés ou s'ils doivent être utilisés, ils devraient avoir un getter? – toongeorges

0

le problème avec votre code est dans ce constructeur:

public Card(String name, String description , String mainImagePath, String secondaryImagePath) { 
    Card newCardToAdd = new Card(name,description,new Image(mainImagePath),new Image(secondaryImagePath)); 
} 

comme vous le voyez, vous créez une nouvelle carte newCardToAdd là-bas, en laissant la nouvelle instance complètement faux ce que vous faites dans de tels cas est d'appeler un constructeur d'un autre ... dans votre cas, vos 2 cosntructeurs doivent regarder comme:

public Card(String name, String description, Image mainImage, Image secondaryImage) { 
    mName = name; 
    mDescription = description; 
    mMainImage = mainImage; 
    mSecondaryImage = secondaryImage; 
} 

public Card(String name, String description, String mainImagePath, String secondaryImagePath) { 
    this(name, description, new Image(mainImagePath), new Image(secondaryImagePath)); 
} 
0

Si vous ne devez passer Image s directement à la classe (seulement les chemins d'image), un seul constructeur suffit:

public Card(String name, String description, 
       String mainImagePath, String secondaryImagePath) { 
    mName = name; 
    mDescription = description; 
    mMainImagePath = mainImagePath; 
    mSecondaryImagePath = secondaryImagePath; 
    mMainImage = new Image(mainImagePath); 
    mSecondaryImage = new Image(secondaryImagePath); 
}