当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中从主窗口调用弹出窗口?

郎宏逸
2023-03-14
  1. main.java--(src/sample文件夹)
  2. studentcontroller.java--(src/sample/controller文件夹)
  3. studentdao.java和sexdao.java(数据访问对象)--(src/sample/model文件夹)
  4. Student.java(公共类学生和构造器)--(src/sample/model文件夹)
  5. oddbc的util下的dbutil--(src/sample/util文件夹)
  6. 用场景生成器创建的FXML文件--(src/sample/view文件夹)
    1. rootlayout.fxml
    2. studentview.fxml(主窗口)
    3. genderpopup.fxml(带有TableView显示记录的弹出窗口)

    Main.java

    package sample;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    import java.io.IOException;
    
    public class Main extends Application {
    private Stage primaryStage;
    private BorderPane rootLayout;
    
    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Sample JavaFX App");
        initRootLayout(); // Initialize RootLayout
        showStudentView();
    }
    
    //Initializes the root layout.
    public void initRootLayout() {
        try {
            FXMLLoader loader = new FXMLLoader();
           loader.setLocation(Main.class.getResource("view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show(); //Display the primary stage
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //Shows the Patient inside the root layout.
    public void showStudentView() {
        try {
          FXMLLoader loader = new FXMLLoader();
          loader.setLocation(Main.class.getResource("view/StudentView.fxml"));
          AnchorPane PatientView = (AnchorPane) loader.load();
          rootLayout.setCenter(PatientView);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
            launch(args);
        }
    }
    

    StudentController.java

    package sample.controller;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    public class StudentController {
        @FXML private TextField studentIdText;
        @FXML private TextField lastNameText;
        @FXML private TextField firstNameText;
        @FXML private TextField sexText;
        @FXML private Button popupButton;
    
        @FXML
        private void initialize () {
    // I have additional listeners here doing different things that I have excluded which do pretty much similar things as shown below
        sexText.focusedProperty().addListener((arg0, oldPropertyValue, newPropertyValue) -> {
            if (!newPropertyValue) {
                try {
                    searchSexDescription();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    // Function to Search Sex Description
    @FXML
    private void searchSexDescription() throws ClassNotFoundException, SQLException {
        try {
            if (!sexText.getText().isEmpty()) {
                // Get Gender Description
                Patient sex = SexDAO.searchSex(sexText.getText());
                populateAndShowSexDescription(sex);
            }
        } catch (SQLException e) {
            System.out.println("Exception raised in searchSexDescription");
            e.printStackTrace();
            throw e;
        }
    }
    
    @FXML
    public void showGenderPopup() throws IOException {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("view/GenderPopup.fxml"));
            Parent root = (Parent) fxmlLoader.load();
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setScene(scene);
            stage.show();
    } catch (IOException e) {
        e.printStackTrace();
      }
    }
    

共有1个答案

万俟沛
2023-03-14

你的道路不正确。您试图从StudentController类而不是Main类获取FXML资源。正如您所提到的,您的项目结构包括:

  • /sample/main.java
  • /sample/controller/studentcontroller.java
  • /sample/view/genderpopup.fxml

由于您在StudentController内调用getClass().getResource(...),所以没有前导/的路径相对于StudentController的位置。这意味着路径最终解析为:

  • /sample/controller/view/genderpopup.fxml

根本不存在。

如果使用StudentController.class查询资源,则需要使用/sample/view/genderpopup.fxml作为路径。

 类似资料:
  • 我想在JavaFX应用程序中创建一个弹出窗口。给我一些想法。 当我点击检查按钮时,它会打开弹出窗口。怎么做?

  • 我在窗格上保留了一个弹出对话框,它位于其他组件的顶部。现在我想禁用访问程序的所有其他组件。怎么做?

  • 我有一个叫IndexController的控制器。它有@GetMapping和@PostMapping方法。当用户键入要转到/索引的URL时,它将加载一个书籍列表。在该索引页面上,有一个“添加新书”按钮,可触发模式弹出窗口。当用户在表单中输入信息并单击“添加”按钮时,它应该调用@PostMapping方法。它没有调用方法。表单的模型是IndexBook。 IndexController类: 索引簿

  • 如何通过弹出窗口显示进度条,并在流程完成后自动关闭。这是我的密码。 进度表类: 这段代码的问题是 如果我使用. show(),显示弹出窗口很流畅,但没有进度条。 如果我使用. show And等待(),显示弹出窗口需要手动退出弹出窗口才能关闭但进度条显示。 对此有什么想法/想法吗?

  • 问题内容: 我正在尝试使用javafx在webview中打开网页。单击超链接后,此网页将打开一个新的弹出窗口。 我如何打开新的弹出窗口,当尝试在默认Web浏览器(例如chrome,IE)中打开同一网页时,它们正在打开弹出窗口。 为了创建弹出窗口,我使用以下代码。 问题答案: 您需要自己创建WebView弹出窗口,并从回调中提供WebEngine。如果需要新窗口,请使用该WebView创建一个新的舞

  • 我有这段代码显示了一个按钮谁显示一个弹出窗口,我希望用户能够关闭弹出窗口点击它的外部时,它是打开的。