2017-09-20 3 views
0

카드 객체를 "CardsColleciton.txt"파일에 저장하려면 (입력하거나 하드 코딩하여) 그런 다음이 객체들을 내 목록 testingList에로드하여 올바르게 표시 할 수 있습니다. 그러나 많은 것을 시도했지만 다음과 같은 두 가지 문제가 발생하는 이유를 알 수 없습니다..txt 파일에서 저장하고 가져 오기하면 데이터 덮어 쓰기가 발생합니다.

1) .txt 파일에 하드 코딩하거나 입력하여 코드를로드하지만 프로그램을 닫은 후에 데이터가 삭제되고 다시 시작해야합니다.

2) 개체를 하드 코드하면 내 목록에 표시되지만 .txt 파일에 정상적으로 쓰면 코드에로드되었다고 표시되어 테스트 목록의 크기가 증가하지만 listView에 표시하지 않습니다.

여기에있는 누군가가 그 두 가지를 파악하는 데 도움이되기를 바랍니다.

추신 : 나는 첫 번째 문제에 관해 비슷한 다른 많은 게시물을 읽었지만 아무도 내 문제를 해결하지 못했습니다.

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 : 여기

내 된 .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 파일을 사용할 수 있도록 테스트 프로젝트를 만들었지 만 프로그램이 끝난 후에 파일의 모든 내용이 삭제되는 문제는 여전히 있습니다 ... 계속 검색 할 것입니다. 그러나 원인을 알면 그것은 나에게 알려 줬다! 미리 감사드립니다. 편집 :이 문제는 파일에 한 번 쓰고 그 파일에서 읽는 코드를 남겨두고 파일에 쓰는 줄을 주석으로 처리 할 때 발생합니다. 잘못된 것입니까? –

+0

파일이 삭제되거나 내용이 사라지는 것입니까? 글쎄, 나는 파일에 쓰는 라인을 주석 처리하지 않을 것이다. 읽기와 쓰기를 다른 방법으로 나누십시오. 어떤 API를 사용하고 있습니까? –

답변

0

여기는 내가 작성한 프로그램의 일부입니다. 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 []은 행을 나타내고 Array의 각 요소는 해당 행의 열을 나타냅니다. 파일의 내용을 수정하려는 경우 먼저 .CSV 파일을 읽고 ArrayList를 수정해야합니다.

참고 : readCSV()은 문자열의 ArrayList 만 반환하므로 ";"으로 문자열을 분할해야합니다. 각 열에 액세스하려면

나는 희망 그거 ... 없습니다 ^^ 너무 혼란

귀하의 addCard() 방법은 기본 목록이 아닌 ListProperty에 추가됩니다
0

. 관측 가능 목록을 만드는 데 사용하는 방법에 대한 documentation에 명시된대로

새로운 관측 가능 목록을 만들고 콜렉션 내용을 추가합니다.

즉, 제공된 목록에 처음에 요소가 포함 된 새 목록이 만들어집니다. 전달한 컬렉션에 대한 이후 변경 사항은 관찰 가능 목록을 변경하지 않습니다.

당신은 아마 여기 하나의 관찰 목록이 필요합니다 :

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); 
관련 문제