2017-09-18 18 views
0

나는 카드 타입의 아이템을 표시하고있는 listView를 가지고 있습니다. 어플리케이션을 닫은 후, 그 카드 오브젝트를 추출하여 .txt 파일에 저장하고 싶습니다. 그러나 List testingList 및 ListPropeprty listProperty가 비어있는 것처럼 보입니다. 이건 내가 이해할 수있는 이유입니다. NullPointerException을 얻는 이유입니다.이 전체 오류를 계산하려고 시도했지만 압도적 인 것 같습니다. 여기 누군가가 도움이되기를 바랍니다. 나 :javaFX 8의 ListView에서 아이템 저장 및로드하기

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) { 
    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; 
} 

}

: 여기

내 Card.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 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); 
    //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) -> { 
     System.out.println("ListView item clicked!"); 
     imageView.setImage(new Image(hit.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!"); 
    if(clickedAgain) { 
     imageView.setImage(new Image(hit.getmMainImage().impl_getUrl())); 
     arrow.setRotate(180); 
     clickedAgain = false; 
    } else { 
     imageView.setImage(new Image(hit.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(Card card : testingList) { 
      writer.printf("%s|%s|%s|%s/n",card.getName(),card.getDescription(), 
        card.getmMainImage().impl_getUrl(),card.getmSecondaryImage().impl_getUrl()); 
     } 
    } catch (IOException ioe) { // If the file couldn't be opened 
     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(); 
    } 
    System.out.printf("%s loaded",testingList.get(0).toString()); 
} 

public void addCard(Card card) { 
    testingList.add(card); 
} 

public void printTestingList() { 
    for (Card card : testingList) { 
     System.out.println(card.toString()); 
    } 
} 

}

내 Main.java :

은 여기 내 home.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{ 
    Parent root = FXMLLoader.load(getClass().getResource("/fxml/home.fxml")); 
    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); 
} 
} 

PS : 나는 또한 수동으로 파일에 쓰는 시도했다하지만 어느 쪽도 일하지 않았다! 여기에 코드를 입력하십시오.

답변

0

나는이 문제가 '가정용 컨트롤러'(대문자로 시작해야 함)가 null이라는 것을 믿습니다. 컨트롤러에 액세스하려면 다음과 같이해야합니다.

FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/fxml/home.fxml")); 

Parent root = loader.load(); 
controller = loader.getController();