所以我正在开发一个密码管理应用程序,这是我第一次尝试使用Java进行GUI。我在应用程序关闭登录窗口后,一旦用户单击“登录”按钮并只显示主应用程序窗口。每当我尝试这样做时,我的setPrevStage
方法存储NULL值,prevStage.close()
方法导致程序崩溃并出现NullPointerException。不知道我做错了什么,所以任何建议都非常感谢。这是我的.java文件,用于此操作。
package pwmanager;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.EventType;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
/**
*
* @author 176878
*/
public class FXMLDocumentController implements Initializable {
@FXML
private Button loginButton;
@FXML
Stage prevStage;
Stage currentStage;
public void setPrevStage(Stage stage){
prevStage = stage;
if (stage == null){
System.out.println("Stage NULL");
}
}
@FXML
public void getPrevStage(Stage stage){
currentStage = prevStage;
}
@FXML
public void loginButtonAction(ActionEvent event) throws IOException {
System.out.println("You clicked me, logging in!");
setPrevStage(prevStage);
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
Parent mainScreen = (Parent)loader.load();
Scene scene = new Scene(mainScreen);
stage.setScene(scene);
stage.setTitle("Password Manager");
prevStage.close();
stage.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
答案 0 :(得分:0)
我没有得到你的问题。但我正在给出我的解决方案,这里的代码可能会对你有所帮助
Stage st = (Stage) loginbutton.getScene().getWindow();
st.hide();
try
{
showFxml(filex);
}
catch (Exception exp)
{
System.out.println("file loading problem "+exp);
}
这是showFxml()
public void showFxml(String filen)throws Exception
{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(""+filen+""));
Parent root1 = (Parent) fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle("Password Manager");
stage.setScene(new Scene(root1));
stage.show();
}
通过使用此功能,您可以隐藏前一阶段并将其带到当前阶段。
答案 1 :(得分:0)
如果在prevStage中存在“旧”阶段,那么您可以尝试:
@FXML
public void loginButtonAction(ActionEvent event) throws IOException {
System.out.println("You clicked me, logging in!");
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
Parent mainScreen = (Parent)loader.load();
Scene scene = new Scene(mainScreen);
prevStage.setScene(scene);
prevStage.setTitle("Password Manager");
prevStage.show();
}
如果不是......在你的Start.class中你定义了静态舞台舞台并在此设置你的主要内容阅读这个例子:
public class Start extends Application {
static Stage stage;
@Override
public void start(Stage primarystage) {
stage=primarystage;
...
stage.show();
}
}
现在代码是这样的:
@FXML
public void loginButtonAction(ActionEvent event) throws IOException {
System.out.println("You clicked me, logging in!");
prevStage=Start.stage; // Start.class
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
Parent mainScreen = (Parent)loader.load();
Scene scene = new Scene(mainScreen);
prevStage.setScene(scene);
prevStage.setTitle("Password Manager");
prevStage.show();
}