簡體   English   中英

如何在JavaFX中初始化DataModel

[英]How to initialize a DataModel in JavaFX

我基於Email類創建了一個數據模型,該類具有一個IntegerProperty,四個StringProperty和一個Date作為參數。 現在,我試圖在ListView中顯示發件人的ID和名稱,並為此執行我在ListController中創建以下方法:

public class ListController {
private ListView<Email> listView ;

private DataModel model ;

public void initModel(DataModel model) {
    // ensure model is only set once:
    if (this.model != null) {
        throw new IllegalStateException("Model can only be initialized once");
    }

    this.model = model ;
    this.model.loadData(null);
    **listView.setItems(model.getEmailList());**

    listView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> 
        model.setCurrentEmail(newSelection));

    model.currentEmailProperty().addListener((obs, oldPerson, newPerson) -> {
        if (newPerson == null) {
            listView.getSelectionModel().clearSelection();
        } else {
            listView.getSelectionModel().select(newPerson);
        }
    });

    listView.setCellFactory(lv -> new ListCell<Email>() {
        @Override
        public void updateItem(Email person, boolean empty) {
            super.updateItem(person, empty);
            if (empty) {
                setText(null);
            } else {
                setText(person.getID() + " " + person.getMittente());
            }
        }
    });
}

問題是,當我調用此方法時,我得到一個java.lang.NullPointerException:listView.setItems(model.getEmailList());

這是我的DataModel類:

public class DataModel {

private final ObservableList<Email> emailList = FXCollections.observableArrayList(email -> 
    new Observable[] {email.IDProperty(), email.MittenteProperty()});

private final ObjectProperty<Email> currentEmail = new SimpleObjectProperty<>(null);

public ObjectProperty<Email> currentEmailProperty() {
    return currentEmail ;
}

public final Email getCurrentEmail() {
    return currentEmailProperty().get();
}

public final void setCurrentEmail(Email email) {
    currentEmailProperty().set(email);
}

public ObservableList<Email> getEmailList() {
    return emailList ;
}

public void loadData(File file) {
    // mock...
    emailList.setAll(
            new Email(1, "Smith", "John", "Casa", "BLAAAAAAAAAAAAA", new Date(1997, 3, 2)),
            new Email(2, "Isabella", "Johnson","Bua", "BUUUUUUU", new Date(1995, 6, 2)), 
            new Email(3, "Ethan", "Williams", "Rapporto", "IIIIIIIIII", new Date(2011, 9, 8)), 
            new Email(4, "Emma", "Jones", "Chiesa", "ALEEEEEEEEEE", new Date(2000, 1, 4)), 
            new Email(5, "Pippo", "Brown", "Vignetta", "OSAAAAAAAA", new Date(1987, 4, 5))
    );
}

public void saveData(File file) { }

}

打開程序后如何立即填充列表而不以這種方式進行操作? 即使通過調用loadData方法填充它,我也會得到NullPointerExcpetion。

編輯:這是主要的類:

public class MailBox extends Application {

@Override
public void start(Stage stage) throws Exception {
    BorderPane root = new BorderPane();

    FXMLLoader listLoader = new FXMLLoader(getClass().getResource("lista.fxml"));
    root.setCenter(listLoader.load());
    ListController listController = listLoader.getController();

    FXMLLoader textareaLoader = new FXMLLoader(getClass().getResource("textarea.fxml"));
    root.setBottom(textareaLoader.load());
    TextAreaController textareaController = textareaLoader.getController();

    DataModel model = new DataModel();
    listController.initModel(model);
    textareaController.initModel(model);

    Scene scene = new Scene(root, 355, 402);
    stage.setScene(scene);
    stage.show();
}

EDIT2:這是TextAreaController類:

public class TextAreaController {

private DataModel model;
private TextArea textarea;

public void initModel(DataModel model) {
    if (this.model != null) {
        throw new IllegalStateException("Model can only be initialized once");
    }
    this.model = model ;
    model.loadData(null);//  aggiunto per far caricare i dati delle person
    model.currentEmailProperty().addListener((obs, oldEmail, newEmail) -> {
        if (oldEmail != null) {
            String id = "ID: "+Integer.toString(oldEmail.IDProperty().getValue().intValue())+"\n";
            textarea.setText(id);
            /*firstNameField.textProperty().unbindBidirectional(oldEmail.firstNameProperty());
            lastNameField.textProperty().unbindBidirectional(oldEmail.lastNameProperty());
            emailField.textProperty().unbindBidirectional(oldEmail.emailProperty());*/
        }
        if (newEmail == null) {
            textarea.setText("");
            /*firstNameField.setText("");
            lastNameField.setText("");
            emailField.setText("");*/
        } else {
            String id = "ID: "+Integer.toString(newEmail.IDProperty().getValue().intValue())+"\n";
            textarea.setText(id);
            /*firstNameField.textProperty().bindBidirectional(newEmail.firstNameProperty());
            lastNameField.textProperty().bindBidirectional(newEmail.lastNameProperty());
            emailField.textProperty().bindBidirectional(newEmail.emailProperty());*/
        }
    });
}

}

控制器:

public class Controller {
    @FXML
    private ListView<Email> listView;
    private DataModel model = new DataModel();

    @FXML
    private void initialize() {
         List<Email> emailList = model.loadData();
         listView.getItems().addAll(emailList);
    }
}

模型:

public class Email {
    int id;
    String firstProperty;
    String secondProperty;
    String thirdProperty;
    String fourthProperty;
    Date date;

    public Email(int id, String firstProperty, String secondProperty, String thirdProperty, String fourthProperty, Date date) {
         this.id = id;
         this.firstProperty = firstProperty;
         this.secondProperty = secondProperty;
         this.thirdProperty = thirdProperty;
         this.fourthProperty = fourthProperty;
         this.date = date;
    }

    @Override
    public String toString(){
        return ("ID: " + this.id + ", Name: " + this.firstProperty);
    }
}

數據模型:

public class DataModel {
    public List<Email> loadData() {

        List<Email> emailList = new ArrayList<>();

        emailList.addAll(
                Arrays.asList(
                        new Email(1, "Smith", "John", "Casa", "BLAAAAAAAAAAAAA", new Date(1997, 3, 2)),
                        new Email(2, "Isabella", "Johnson", "Bua", "BUUUUUUU", new Date(1995, 6, 2)),
                        new Email(3, "Ethan", "Williams", "Rapporto", "IIIIIIIIII", new Date(2011, 9, 8)),
                        new Email(4, "Emma", "Jones", "Chiesa", "ALEEEEEEEEEE", new Date(2000, 1, 4)),
                        new Email(5, "Pippo", "Brown", "Vignetta", "OSAAAAAAAA", new Date(1987, 4, 5))
                )
        );

        return emailList;
    }
}

希望它能工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM