Robię projekt w JavieFX i mam problem, który polega na tym, że MainController nie otrzymuje zaaktualizowanej listy z AddControllera. Albo po prostu AddController nie zwraca prawidłowo listy i jsonObject. Zaimplementowałem przy dodawaniu obiektu do listy, żeby zamieniał obiekty na format json, aby zapisać je potem w pliku jako tekst. Prawidłowo dodaje obiekty do listy, bo pokazuje mi je w TableView i potem prawidłowo konwertuje obiekty na jsonObject, bo sprawdziłem w konsoli. Niestety, przy zapisie jsonObject jest pusty. Próbowałem to robić na kilka sposobów, ale już nie mam pomysłu. Może ktoś tutaj zauważy gdzie popełniam błąd.
public class MainController implements Initializable { @FXML MenuItem addF; @FXML MenuItem editF; @FXML MenuItem deleteF; @FXML protected TableView<Person> person = new TableView<Person>(); @FXML private TableColumn<Person, String> nameCol; @FXML private TableColumn<Person, String> surnameCol; @FXML private TableColumn<Person, String> ageCol; @FXML private TableColumn<Person, String> sexCol; @FXML private TableColumn<Person, String> locCol; @FXML protected static ObservableList<Person> data = FXCollections.observableArrayList( new Person("seba","miko","20","inne","Milicz" ) ); protected static ArrayList<Person> list = new ArrayList<Person>(); private String jsonObject; @Override public void initialize(URL location, ResourceBundle resources){ person.setEditable(true); nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("Name")); nameCol.setCellFactory(TextFieldTableCell.forTableColumn()); nameCol.setOnEditCommit( new EventHandler<CellEditEvent<Person, String>>() { @Override public void handle(CellEditEvent<Person, String> t) { ((Person) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setName(t.getNewValue()); } } ); surnameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("Surname")); surnameCol.setCellFactory(TextFieldTableCell.forTableColumn()); surnameCol.setOnEditCommit( new EventHandler<CellEditEvent<Person, String>>() { @Override public void handle(CellEditEvent<Person, String> t) { ((Person) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setSurname(t.getNewValue()); } } ); ageCol.setCellValueFactory(new PropertyValueFactory<Person, String>("Age")); ageCol.setCellFactory(TextFieldTableCell.forTableColumn()); ageCol.setOnEditCommit( new EventHandler<CellEditEvent<Person, String>>() { @Override public void handle(CellEditEvent<Person, String> t) { ((Person) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setAge(t.getNewValue()); } } ); sexCol.setCellValueFactory(new PropertyValueFactory<Person, String>("Sex")); sexCol.setCellFactory(TextFieldTableCell.forTableColumn()); sexCol.setOnEditCommit( new EventHandler<CellEditEvent<Person, String>>() { @Override public void handle(CellEditEvent<Person, String> t) { ((Person) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setSex(t.getNewValue()); } } ); locCol.setCellValueFactory(new PropertyValueFactory<Person, String>("Location")); locCol.setCellFactory(TextFieldTableCell.forTableColumn()); locCol.setOnEditCommit( new EventHandler<CellEditEvent<Person, String>>() { @Override public void handle(CellEditEvent<Person, String> t) { ((Person) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setLocation(t.getNewValue()); } } ); try { readList(list); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } data.addAll(list); person.setItems(data); person.refresh(); } @FXML public void addA(ActionEvent event) throws Exception { Stage primaryStage2 = new Stage(); Parent root2 = FXMLLoader.load(getClass().getResource("\\Add.fxml")); Scene scene2 = new Scene(root2); scene2.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage2.setScene(scene2); primaryStage2.show(); } @FXML public void editA(ActionEvent event) throws Exception { Stage primaryStage2 = new Stage(); Parent root2 = FXMLLoader.load(getClass().getResource("\\Edit.fxml")); Scene scene2 = new Scene(root2); scene2.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage2.setScene(scene2); primaryStage2.show(); } @FXML public void removeA(ActionEvent event) throws Exception { Person selected = person.getSelectionModel().getSelectedItem(); data.remove(selected); } @FXML public void saveListA(ActionEvent event) throws IOException { // write object to fill // FileOutputStream fos = new FileOutputStream("listOfPeople.json"); // ObjectOutputStream oos = new ObjectOutputStream(fos); // oos.writeObject(jsonObject); // // fos.flush(); // fos.close(); try { //write converted json data to a file named "CountryGSON.json" FileWriter writer = new FileWriter("listOfPeople.json"); String s = getJsonObject(); writer.write(s); writer.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(jsonObject); System.out.println("działa"); Stage primaryStage3 = new Stage(); Parent root3 = FXMLLoader.load(getClass().getResource("\\Save.fxml")); Scene scene3 = new Scene(root3); scene3.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage3.setScene(scene3); primaryStage3.show(); } private void readList(ArrayList<Person> list) throws IOException, ClassNotFoundException { // try { // FileInputStream in = new FileInputStream("listOfPeople.txt"); // ObjectInputStream ois = new ObjectInputStream(in); // List<Person> data = (List<Person>) ois.readObject() ; // // return FXCollections.observableList(data); // } catch (ClassNotFoundException e) { // e.printStackTrace(); // } catch (IOException e) { // e.printStackTrace(); // } // return FXCollections.emptyObservableList(); try { Gson gson = new Gson(); BufferedReader br = new BufferedReader( new FileReader("listOfPeople.json")); Person read = gson.fromJson(br, Person.class); System.out.println(read); list.add(read); // list = (ArrayList<Person>) oos.readObject(); System.out.println(list.size()); // fout.close(); // } catch (ClassNotFoundException e) { // e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static ObservableList<Person> getData() { return data; } public static void setData(ObservableList<Person> data) { MainController.data = data; } public static ArrayList<Person> getList() { return list; } public static void setList(ArrayList<Person> list) { MainController.list = list; } public String getJsonObject() { return jsonObject; } public void setJsonObject(String jsonObject) { this.jsonObject = jsonObject; } }
public class AddController extends MainController implements Initializable { @FXML private TextField nameT; @FXML private TextField surnameT; @FXML private TextField locT; @FXML private DatePicker dateOfBirth; @FXML private RadioButton sexM; @FXML private RadioButton sexF; @FXML private RadioButton sexG; @FXML private Button finish; @FXML private Label lblN; @FXML private Label lblS; @FXML private Label lblL; @FXML private ToggleGroup sexToggleGroup = new ToggleGroup(); private boolean num; private boolean num2; private boolean num3; private boolean num4; @Override public void initialize(URL location, ResourceBundle resources){ sexM.setToggleGroup(sexToggleGroup); sexF.setToggleGroup(sexToggleGroup); sexG.setToggleGroup(sexToggleGroup); sexM.setUserData("Male"); sexF.setUserData("Female"); sexG.setUserData("Gender Asshole"); nameT.textProperty().addListener((observable, oldValue, newValue) -> { String newWordN = StringUtils.capitalize(newValue); nameT.setText(newWordN); if(num == StringUtils.isAlpha(newValue)){ lblN.setText("Only letters"); num = true; } else { num = false; } }); surnameT.textProperty().addListener((observable, oldValue, newValue) -> { String newWordS = StringUtils.capitalize(newValue); surnameT.setText(newWordS); if(num2 == StringUtils.isAlpha(newValue)){ lblS.setText("Only letters"); num2 = true; } else { num2 = false; } }); locT.textProperty().addListener((observable, oldValue, newValue) -> { String newWordS = StringUtils.capitalize(newValue); locT.setText(newWordS); if(num3 == StringUtils.isAlpha(newValue)){ lblL.setText("Only letters"); num3 = true; } else { num3 = false; } }); // Gson(list, getJsonObject()); } public ArrayList<Person> textAd(){ Person one = new Person( nameT.getText(), surnameT.getText(), dateOfBirth.getEditor().getText(), sexToggleGroup.getSelectedToggle().getUserData().toString(), locT.getText() ); list.add(one); setList(list); gsonConvert(list, getJsonObject()); System.out.println(list.get(list.size() - 1).getSurname()); System.out.println(list.size()); return list; } public ObservableList<Person> listAd(){ textAd(); Person one = list.get(list.size() - 1); changeDate(one); Person two = new Person( one.getName(), one.getSurname(), one.getAge(), one.getSex(), one.getLocation() ); data.addAll(two); setData(data); System.out.println(data.get(data.size() - 1).getName()); System.out.println(data.size()); return data; } public void changeDate(Person one){ LocalDate newDate = LocalDate.now(); int year = newDate.getYear(); int date = dateOfBirth.getValue().getYear(); System.out.println(year - date); one.setAge(String.valueOf(year - date)); } public void gsonConvert(ArrayList<Person> list, String jsonObject){ Person one = list.get(list.size() - 1); Gson gson = new Gson(); jsonObject = gson.toJson(one); System.out.println(jsonObject); } @FXML public void btn1(ActionEvent event) throws Exception { listAd(); person.setItems(data); person.refresh(); Stage stage = (Stage) finish.getScene().getWindow(); stage.close(); } public TextField getNameT() { return nameT; } public void setNameT(TextField nameT) { this.nameT = nameT; } public TextField getSurnameT() { return surnameT; } public void setSurnameT(TextField surnameT) { this.surnameT = surnameT; } public TextField getLocT() { return locT; } public void setLocT(TextField locT) { this.locT = locT; } public DatePicker getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(DatePicker dateOfBirth) { this.dateOfBirth = dateOfBirth; } public RadioButton getSexM() { return sexM; } public void setSexM(RadioButton sexM) { this.sexM = sexM; } public RadioButton getSexF() { return sexF; } public void setSexF(RadioButton sexF) { this.sexF = sexF; } public RadioButton getSexG() { return sexG; } public void setSexG(RadioButton sexG) { this.sexG = sexG; } public ToggleGroup getSexToggleGroup() { return sexToggleGroup; } public void setSexToggleGroup(ToggleGroup sexToggleGroup) { this.sexToggleGroup = sexToggleGroup; } }