카드 객체를 "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);
}
}
내가 csv 파일 대신에 작성하는 것이 좋습니다 모두 잘 첫번째 그들은 꽤 다루기 쉽고 거의 동일하기 때문에 그냥 일반 txt 파일입니다. 또한 csv 파일에 사용할 수있는 API가 많이 있습니다. –
@AlexanderHeim, CSV 파일을 사용할 수 있도록 테스트 프로젝트를 만들었지 만 프로그램이 끝난 후에 파일의 모든 내용이 삭제되는 문제는 여전히 있습니다 ... 계속 검색 할 것입니다. 그러나 원인을 알면 그것은 나에게 알려 줬다! 미리 감사드립니다. 편집 :이 문제는 파일에 한 번 쓰고 그 파일에서 읽는 코드를 남겨두고 파일에 쓰는 줄을 주석으로 처리 할 때 발생합니다. 잘못된 것입니까? –
파일이 삭제되거나 내용이 사라지는 것입니까? 글쎄, 나는 파일에 쓰는 라인을 주석 처리하지 않을 것이다. 읽기와 쓰기를 다른 방법으로 나누십시오. 어떤 API를 사용하고 있습니까? –