Как мне вызвать всплывающее окно из моего главного окна в JavaFX? - PullRequest
0 голосов
/ 19 июня 2019

Это тоже мой первый пост.Это также мой первый проект с использованием JavaFX.Я пытаюсь вызвать небольшое всплывающее окно (вызывая какой-то ключ, такой как, например, F9), у которого будет TableView из текстового поля в главном окне.Сейчас я пытаюсь вызвать всплывающее окно с помощью кнопки в главном окне.Я, конечно, хочу вернуть значение из TableView обратно в главное окно, но это будет позже.У меня возникают проблемы, даже при вызове моего всплывающего окна.

Я уже рассмотрел различные примеры и решения, но не смог решить свою проблему.В конечном итоге я получу три всплывающих окна, вызываемых из моего главного окна.

У меня есть следующие файлы в моей архитектуре MVC:

  1. Main.java - (папка src / sample)
  2. StudentController.java - (папка src / sample / controller)
  3. StudentDAO.java и sexDAO.java (объект доступа к данным) -(папка src / sample / model)
  4. Student.java (общедоступный класс Student и конструктор) - (папка src / sample / model)
  5. DBUtil под util для OJDBC - (srcПапка / sample / util)
  6. Файлы FXML, созданные с помощью Scene Builder - (папка 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();
  }
}

StudentView.fxml

Это главное окнокоторый есть кнопка, которую onAction вызывает showGenderPopup ()

Итак, на этом этапе моя Учебная запись выбирается в главном окне.Однако, когда я нажимаю кнопку «Всплывающее окно», чтобы попытаться вызвать всплывающее окно, я получаю сообщение об ошибке (Местоположение не указано).Теперь я знаю, что это не ошибка с именем файла, которая возникает с подобной ошибкой.Мой путь правильный, как и имя файла.Я предполагаю, что каким-то образом всплывающее окно, будучи ребенком, не может найти Родителя.Любая помощь очень ценится!

Ошибка: Вызывается: java.lang.IllegalStateException: Местоположение не установлено.

Спасибо

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Ваш путь неверен.Вы пытаетесь получить ресурс FXML из вашего StudentController класса, а не из Main класса.Как вы упомянули, ваша структура проекта включает в себя:

  • /sample/Main.java
  • /sample/controller/StudentController.java
  • /sample/view/GenderPopup.fxml

Поскольку вывызовите getClass().getResource(...) внутри StudentController путь без ведущего / относительно местоположения StudentController.Это означает, что путь в конечном итоге разрешен:

  • /sample/controller/view/GenderPopup.fxml

Которого не существует.

Вам необходимо использовать /sample/view/GenderPopup.fxml какпуть при использовании StudentController.class для запроса ресурса.

0 голосов
/ 20 июня 2019

Мое всплывающее окно теперь работает @ Slaw.

Однако, когда я включаю контроллер в свой файл FXML (мне нужно использовать функции, которые есть в StudentController), я получаю исключение нулевого указателя. Я добавил контроллер в GenderPopup.fxml

fx: controller = "sample.controller.StudentController" в AnchorPane.

Из трассировки стека кажется, что проблема может быть в строке:

Родительский корень = (Родительский) fxmlLoader.load ();

Вы знаете, что здесь может происходить?

@FXML
public void showGenderPopup() throws IOException {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/sample/view/GenderPopup.fxml"));
        Parent root = (Parent) fxmlLoader.load();
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();
        searchAllGender(this.actionEvent);
        genderCodeColumn.setCellValueFactory(cellData -> cellData.getValue().genderCodeProperty());
        genderDescriptionColumn.setCellValueFactory(cellData -> cellData.getValue().genderDescriptionProperty());
} catch (IOException e)
    {
    e.printStackTrace();
  } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
...