JavaFX无法从TextArea/TextField获取文本,数据库存入空值求助
解决JavaFX中FXML控件绑定失败导致数据为空的问题
问题描述
使用JavaFX作为GUI框架、JDBC作为数据库API,saveCard()方法本应从TextArea和TextField解析用户输入的文本,通过database.insertQuestionAndAnswer()存入数据库,但实际获取的是空字符串,数据库无内容,已确认字符串非null。
核心错误
控制器中手动创建了TextField和TextArea的实例,且未给变量添加@FXML注解,导致FXMLLoader无法将界面上的控件与控制器变量绑定,你操作的是一个全新的空控件,而非用户输入的界面控件。
修复方案
修改控制器代码,给控件变量添加@FXML注解,删除手动创建实例的代码:
package workspace; import java.io.IOException; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; public class CardMakerController { @FXML private CardDatabase database = new CardDatabase(); @FXML private TextField questionContainer; @FXML private TextArea answerContainer; public void changeViewToDefaultScreen(ActionEvent e) throws IOException { App.setRootForScene("welcomeScreen"); } public void saveCard() { String cardQuestion = questionContainer.getText(); String cardAnswer = answerContainer.getText(); System.out.println("问题:" + cardQuestion + ",答案:" + cardAnswer); database.insertQuestionAndAnswer(cardQuestion, cardAnswer); } }
原理说明
FXML文件中通过fx:id标记的控件,需要控制器中对应的变量添加@FXML注解来完成绑定,FXMLLoader会自动初始化这些变量并关联到界面上的控件。如果手动创建实例,会覆盖FXMLLoader的注入,导致操作的是与界面无关的空控件,自然获取不到用户输入。
另外修正了原代码中的打印错误,确保调试时能正确输出问题和答案内容。
内容的提问来源于stack exchange,提问作者John Berlin Leonor
相关产品推荐
相关产品推荐

