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