无法在 javaFX 中显示数据库中选定行的数据
Can't display selected row's data from database in javaFX
我正在尝试在 JavaFX 和 Sqlite 中创建用户登录和注册应用程序。
我成功地将数据插入数据库 Window 并且 Select 登录中数据库中的数据 window。
但是我需要在新的 window 中显示用户的所有数据(在数据库中记录)。我为它输入了一些代码,但每次登录后它只显示用户 window.
数据库中的最后数据
login code:
@FXML
public Label errMesage;
@FXML
public TextField userNameTF;
@FXML
public TextField passwordTF;
@FXML
public Button loginBtn;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
public void handleSecoundaryRegestrationLink(ActionEvent event) throws IOException{
Parent switchAlterRegestrationPage = FXMLLoader.load(getClass().getResource("/gui/gui1.fxml"));
Scene sceneAlterRegestrationPage = new Scene(switchAlterRegestrationPage);
Stage stageAlterRegestrationPage = (Stage)((Node)event.getSource()).getScene().getWindow();
stageAlterRegestrationPage.hide();
stageAlterRegestrationPage.setScene(sceneAlterRegestrationPage);
stageAlterRegestrationPage.show();
}
public void handleLoginBtn(ActionEvent event) throws IOException{
Parent login = FXMLLoader.load(getClass().getResource("/gui/user.fxml"));
Scene sceneLogin = new Scene(login);
Stage stageLogin = (Stage)((Node)event.getSource()).getScene().getWindow();
if(isValidLoginCOndition()){
stageLogin.hide();
stageLogin.setScene(sceneLogin);
stageLogin.show();
}
else{
errMesage.setText("UserName or Password not Matched!");
}
}
public boolean isValidLoginCOndition() {
boolean let_in = false;
System.out.println("SELECT * FROM user WHERE usrName = "+"'" + userNameTF.getText() +"'"
+ "AND PASSWORD "+ "'" + passwordTF.getText()+"'");
Connection c = null;
Statement stmt = null;
try {
c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM user WHERE USERNAME= " + "'" + userNameTF.getText() + "'"
+ " AND PASSWORD= " + "'" + passwordTF.getText() + "'");
while ( rs.next() ) {
if (rs.getString("USERNAME") != null && rs.getString("PASSWORD") != null) {
String username = rs.getString("USERNAME");
System.out.println( "USERNAME = " + username );
String password = rs.getString("PASSWORD");
System.out.println("PASSWORD = " + password);
let_in = true;
}
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
return let_in;
}
}
user Form code:
@FXML
public Label loginFullName;
@FXML
public Label emailLB;
@FXML
public Label loginFullName2;
@FXML
public AnchorPane usrAP;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void handleShowDetails(){
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM user");
while ( rs.next()) {
String fullname = rs.getString("FULLNAME");
String email = rs.getString("EMAIL");
loginFullName.setText(fullname);
emailLB.setText(email);
loginFullName2.setText(fullname);
System.out.println( "FULLNAME = " + fullname );
System.out.println( "EMAIL = " + email );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
public void handleLogOut(ActionEvent event) throws IOException{
Parent logout = FXMLLoader.load(getClass().getResource("/gui/login.fxml"));
Scene sceneLogOut = new Scene(logout);
Stage stageLogOut = (Stage) ((Node)event.getSource()).getScene().getWindow();
stageLogOut.hide();
stageLogOut.setScene(sceneLogOut);
stageLogOut.show();
}
}
如果我理解你想要的行为,你想通过调用 handleShowDetails 函数以额外的形式显示用户详细信息。
如果是这样,sql 调用
Select * from user
将从数据库中获取所有用户。然后你遍历数据并设置一个标签登录全名,它总是只显示 while 循环的最后一项。
因此,如果您只想显示当前登录用户的数据,则必须将这些额外参数传递给您的 sql 调用,例如
Select * from user where usrName=...
就像您在登录表单中所做的那样。
为了优化,您最好将登录过程中的用户数据存储在用户对象中,以避免在会话期间多次调用您可以使用的数据库。
我正在尝试在 JavaFX 和 Sqlite 中创建用户登录和注册应用程序。
我成功地将数据插入数据库 Window 并且 Select 登录中数据库中的数据 window。
但是我需要在新的 window 中显示用户的所有数据(在数据库中记录)。我为它输入了一些代码,但每次登录后它只显示用户 window.
login code:
@FXML
public Label errMesage;
@FXML
public TextField userNameTF;
@FXML
public TextField passwordTF;
@FXML
public Button loginBtn;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
public void handleSecoundaryRegestrationLink(ActionEvent event) throws IOException{
Parent switchAlterRegestrationPage = FXMLLoader.load(getClass().getResource("/gui/gui1.fxml"));
Scene sceneAlterRegestrationPage = new Scene(switchAlterRegestrationPage);
Stage stageAlterRegestrationPage = (Stage)((Node)event.getSource()).getScene().getWindow();
stageAlterRegestrationPage.hide();
stageAlterRegestrationPage.setScene(sceneAlterRegestrationPage);
stageAlterRegestrationPage.show();
}
public void handleLoginBtn(ActionEvent event) throws IOException{
Parent login = FXMLLoader.load(getClass().getResource("/gui/user.fxml"));
Scene sceneLogin = new Scene(login);
Stage stageLogin = (Stage)((Node)event.getSource()).getScene().getWindow();
if(isValidLoginCOndition()){
stageLogin.hide();
stageLogin.setScene(sceneLogin);
stageLogin.show();
}
else{
errMesage.setText("UserName or Password not Matched!");
}
}
public boolean isValidLoginCOndition() {
boolean let_in = false;
System.out.println("SELECT * FROM user WHERE usrName = "+"'" + userNameTF.getText() +"'"
+ "AND PASSWORD "+ "'" + passwordTF.getText()+"'");
Connection c = null;
Statement stmt = null;
try {
c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM user WHERE USERNAME= " + "'" + userNameTF.getText() + "'"
+ " AND PASSWORD= " + "'" + passwordTF.getText() + "'");
while ( rs.next() ) {
if (rs.getString("USERNAME") != null && rs.getString("PASSWORD") != null) {
String username = rs.getString("USERNAME");
System.out.println( "USERNAME = " + username );
String password = rs.getString("PASSWORD");
System.out.println("PASSWORD = " + password);
let_in = true;
}
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
System.out.println("Operation done successfully");
return let_in;
}
}
user Form code:
@FXML
public Label loginFullName;
@FXML
public Label emailLB;
@FXML
public Label loginFullName2;
@FXML
public AnchorPane usrAP;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void handleShowDetails(){
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:regestration.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM user");
while ( rs.next()) {
String fullname = rs.getString("FULLNAME");
String email = rs.getString("EMAIL");
loginFullName.setText(fullname);
emailLB.setText(email);
loginFullName2.setText(fullname);
System.out.println( "FULLNAME = " + fullname );
System.out.println( "EMAIL = " + email );
System.out.println();
}
rs.close();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
public void handleLogOut(ActionEvent event) throws IOException{
Parent logout = FXMLLoader.load(getClass().getResource("/gui/login.fxml"));
Scene sceneLogOut = new Scene(logout);
Stage stageLogOut = (Stage) ((Node)event.getSource()).getScene().getWindow();
stageLogOut.hide();
stageLogOut.setScene(sceneLogOut);
stageLogOut.show();
}
}
如果我理解你想要的行为,你想通过调用 handleShowDetails 函数以额外的形式显示用户详细信息。 如果是这样,sql 调用
Select * from user
将从数据库中获取所有用户。然后你遍历数据并设置一个标签登录全名,它总是只显示 while 循环的最后一项。
因此,如果您只想显示当前登录用户的数据,则必须将这些额外参数传递给您的 sql 调用,例如
Select * from user where usrName=...
就像您在登录表单中所做的那样。
为了优化,您最好将登录过程中的用户数据存储在用户对象中,以避免在会话期间多次调用您可以使用的数据库。