JavaFX ListView 控制器通信和数据库问题

JavaFX ListView controller communication and and Database Issues

基本上我有一个带有列表和添加学生按钮的主场景。单击“添加学生”按钮会打开一个新的 window,其中有两个文本字段,名称和姓氏。然后将这两个传递给 Student 对象构造函数,该构造函数包含学生的姓氏和名字等属性。新的学生对象现在已存储,我使用方法 addToNames 使用 student.getName() 和 student.getSurname() 将属性添加到列表视图中。问题是它没有在列表中显示名称,并且在使用打印语句进行调试时,我发现每个学生对象都按照我实现它的方式覆盖了前一个对象。它变得更加奇怪,因为我记得尝试过简单的 print 语句变体来实现它,有些有效,有些无效。我唯一记得的例子是,当我在我的 addToNames 方法中使用 print("lol") 时,就像现在一样,它会起作用。我还想将这些值存储在我已经建立连接的 MySQL 数据库中。但是,我不知道该怎么做。这是我的代码

我的JavaFX主场景控制器class

public class Events {

@FXML
private Button studentADD;
@FXML
private Button add;
@FXML
private ListView<String> nameslist;

private Student[] Students = new Student[200];



public void addToNames(Student student) {
    nameslist.getItems().add("xd");
    System.out.println(student.getName() + " " + student.getSurname());
}


public void switchToStudentAdd(ActionEvent e) throws IOException {
    //Student stud = new Student("John", "Appleseed");
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("AddStud.fxml"));
    Parent root = (Parent) fxmlLoader.load();
    Stage stage = new Stage();
    stage.setScene(new Scene(root));  
    stage.show();
    //nameslist.getItems().add(stud.getName() + " " + stud.getSurname());
}}
        

我的JavaFX加学生window辅助场景控制器class

public class AddStudEvents{

@FXML
private TextField firstName;
@FXML
private TextField lastName;
@FXML
private Button addStudent;

public void addNameToList(ActionEvent e) throws IOException {
    String name = firstName.getText();
    String lastname = lastName.getText();
    
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
    Parent root = loader.load();
    Events maincontroller = loader.getController();
    
    Student student = new Student(name, lastname);
    maincontroller.addToNames(student);
}}

我的 SQL 添加方法(它确实有效,但是我希望它插入变量 student.getName() 和一个变量 student.getSurname() 字符串,以及一个数组student Marks 是学生 class 的另一个属性,但我不知道这是否适用于数组。我要去某个地方我需要使用 JSON,但我不确定那是什么手段。我正在使用 SQL workbench)

public class DatabaseControl {

static String url = "jdbc:mysql://localhost:3306/ia";
static String username = "root";
static String password = "sifra123";
static Connection connection = null;

public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException, SQLException {
    Class.forName("com.mysql.jdbc.Driver").getDeclaredConstructor().newInstance();
    connection = DriverManager.getConnection(url, username, password);
    PreparedStatement ps = connection.prepareStatement("INSERT INTO ia.student (name) VALUES ('yussef walker');");
    PreparedStatement ps1 = connection.prepareStatement("INSERT INTO ia.student (surname) VALUES ('yussef walker');");
    PreparedStatement ps2 = connection.prepareStatement("INSERT INTO ia.student (surname) VALUES ('yussef walker');");
    
    int status = ps.executeUpdate();
    
    if(status != 0) {
        System.out.println("Connection established");
        System.out.println("Inserted");
    }

}}

抱歉把最后的花括号放得太奇怪了,文本编辑器不允许我正确地做。

编辑:我更愿意将它添加到数据库中,然后如果可能的话能够用我的数据库名称和姓氏填充列表视图

我认为您的主要问题在于,为了访问控制器,您每次都从 FXML 重新加载视图以尝试添加名称。如果您重新加载 FXML,您得到的不是同一个实例,而是一个新实例。将其视为创建一个空副本。

加载程序这样做的原因是为了使 FXML 可重用。例如,如果您有一个要在多个地方重复使用的“保存”对话框,您不希望对一个实例所做的更改影响所有其他实例。

尝试相应地更改您的编码 - 例如,当您加载用于添加学生的对话框时,您可以通过 setter.

将其连接到主视图的控制器

至于 SQL 问题,您可能需要创建一个单独的问题。为了帮助您入门,您可能需要查看 javadoc for PreparedStatement,它在页面顶部提供了一个关于如何将值传递给语句的示例。