在 javaFX 8 中从 ListView 保存和加载项目时出错[重复]

问题描述 投票:0回答:1

我有一个 listView,其中显示了 Card 类型的项目。关闭应用程序后,我想提取这些 Card 对象并将它们保存到 .txt 文件中。但是,ListtestingList 和 ListPropeprty listProperty 似乎为空据我所知,这就是我得到 NullPointerException 的原因。我尝试解决整个错误问题,但我不知所措。希望这里有人可以帮助我:

这是我的 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) {
    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 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:

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:我也尝试过手动写入文件,但这也不起作用!

java listview javafx loading saving-data
1个回答
0
投票

仔细观察一下,我认为问题在于“home”控制器(名称应以大写字母开头)为空。为了访问您的控制器,您需要执行以下操作:

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

Parent root = loader.load();
controller = loader.getController();
© www.soinside.com 2019 - 2024. All rights reserved.