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,它在页面顶部提供了一个关于如何将值传递给语句的示例。
基本上我有一个带有列表和添加学生按钮的主场景。单击“添加学生”按钮会打开一个新的 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,它在页面顶部提供了一个关于如何将值传递给语句的示例。