2017-09-20 1 views
0

カードオブジェクトを "CardsColleciton.txt"ファイルに保存できるようにするには(入力するか、ハードコーディングしてください)これらのオブジェクトを私のリストtestingListにロードして、正しく表示できるようにします。しかし、私は多量の試してみましたが、なぜ次の2つの問題が起こるのか分かりません:.txtファイルに保存してからインポートすると、データが上書きされます

1)私は.txtファイルにハードコーディングするか、または入力することでコードをロードしますが、プログラムを閉じた後にデータが削除され、やり直す必要があります。

2)オブジェクトをハードコードするとリストに表示されますが、.txtファイルに正常に書き込むと、コードにロードされていると表示されますが、テストリストのサイズは増加しますが、それらをlistViewに表示しません。

ここにいる誰かが、私はこれらの2つを把握するのに役立ちます。

PS:私は第1の問題について多くの他の類似の記事を読んだが、どれも私を解決しなかった。ここで

は私の.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; 
} 
} 

コントローラ - > 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); 
} 
} 
+0

私はcsvファイルの代わりに書くことをお勧めしますすべてのまあ最初の彼らはかなり扱いやすく、ほとんど同じであるので、単純なtxtファイルです。また、csvファイルに使用できるAPIがたくさんあります。 –

+0

@AlexanderHeim、私はcsvファイルを使用することができるように、私はテストプロジェクトを作成したが、プログラムが終了した後、ファイルのすべてが削除される問題が依然として存在している...あなたは原因を知っていれば私も探したが上おこうそれは私に知らせる!前もって感謝します。 EDIT:この問題は、ファイルに一度書き込んだ後、ファイルに書き込む行をコメントアウトして、読み込み用のコードだけを残しているときに発生します。間違っていますか? –

+0

ファイルが削除されるか、コンテンツだけが消えていますか?まあ、私はファイルに書き込む行をコメントしません。読み書きを別の方法に分割してみてください。どのAPIを使用していますか? –

答えて

0

これは私がcouを書いたプログラムの一部ですPLEヶ月前に、あなたのcsvファイルにアクセスするために、これらの方法を試してください:

// Writes to CSV File 
    private void writeCSV(ArrayList<String[]> newContent){ 

     CSVWriter writer; 

     try { 
      writer = new CSVWriter(new FileWriter(this.path), ';', CSVWriter.NO_QUOTE_CHARACTER); 
      writer.writeAll(newContent); 
      writer.flush(); 
      writer.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(CSVFile.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    // Reads from CSV File 
    private ArrayList<String> readCSV(){ 
     BufferedReader br = null; 
     String line = ""; 
     ArrayList<String> ret = new ArrayList(); 

     try { 

      br = new BufferedReader(new FileReader(this.path)); 
      while ((line = br.readLine()) != null) { 
       ret.add(line); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return ret; 
    } 

これは、書き込み用のAPI openCSVを使用し、普通BufferedReaderの(必要に応じて特別な輸入品)を読み取るため。

writeCSV().csvファイルの全体の内容を上書きすることができます。各String []は行を表し、その配列の各要素はその行の列を表します。ファイル内のコンテンツを変更する場合は、最初にファイル.CSVを読み込み、ArrayListを変更する必要があります。

注:readCSV()は文字列のArrayListを返します。したがって、文字列を ";"で分割する必要があります。各列にアクセスするために使用します。

私はあまりにも混乱that'sないと思い^^

0

あなたaddCard()方法はListProperty、根底にあるリストにない追加されます。メソッドのdocumentationで述べたように、あなたは

観察可能なリストを作成するために使用する新しい観測可能な配列のリストを作成し、それを回収COLの内容を追加します。

つまり、最初に提供されたリストの要素を含む新しいリストが作成されます。あなたが渡したコレクションへのその後の変更は、観測可能リストを変更しません。

はおそらく、ちょうどここに、単一の観察可能なリストが必要になります。

public class Home implements Initializable { 

    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; 

    private ObservableList<Card> cards = FXCollections.observableArrayList(); 


    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     addCard(goku); 

     listView.setItems(cards); 

     // Handle listView selection changes 
     listView.getSelectionModel().selectedItemProperty().addListener(((observable, oldCard, newCard) -> { 

      System.out.printf("ListView item clicked! Value retrieved: %s\n", newCard); 
      imageView.setImage(newCard.getmMainImage()); 
      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 = listView.getSelectionModel().getSelectedItem(); 
     if (clickedAgain) { 
      imageView.setImage(currentlySelectedCard.getmMainImage()); 
      arrow.setRotate(180); 
      clickedAgain = false; 
     } else { 
      imageView.setImage(currentlySelectedCard.getmSecondaryImage()); 
      arrow.setRotate(360); 
      clickedAgain = true; 
     } 
    } 

    // Saving 
    public void exportTo(String fileName) { 
     try (
       FileOutputStream fos = new FileOutputStream(fileName); 
       PrintWriter writer = new PrintWriter(fos); 
     ) { 
      for (Card card : cards) { 
       // TODO should make image locations properties of card 
       // to implement this properly 
       writer.printf("%s|%s|%s|%s\n", card.getName(), card.getDescription(), 
         card.getmMainImage().impl_getUrl(), card.getmSecondaryImage().impl_getUrl()); 
       System.out.println(card.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) { 
     cards.add(card); 
    } 

    // DEBUG purposes 
    public void printTestingList() { 
     for (Card card : cards) { 
      System.out.println(card.toString()); 
     } 
    } 

} 

あなたの最初の問題は、私には非常に明確ではありません。追加の「プレーン」リストとListPropertyの必要はありませんを作成する必要はありません。あなたが保存するときは、既存のファイルにカードを追加したい意味ならば、あなたが

FileOutputStream fos = new FileOutputStream(fileName); 

を交換する必要が

FileOutputStream fos = new FileOutputStream(fileName, true); 
関連する問題